RocketMQ3.2.2 생산자가 메시지를 보내면 자동으로 Topic 대기열을 4개 이상 만들 수 없습니다
2980 단어 RocketMQ
RocketMQ3.2.2 버전, 테스트 시 메시지를 보내려고 시도할 때 자동으로 Topic을 만들고 대기열 수를 8로 설정합니다.
producer.setDefaultTopicQueueNums(8);
브로커 서버의 프로필 브로커를 설정합니다.properties:
defaultTopicQueueNums=16
그러나 실제 창설 후 컨트롤 데스크톱과 백그라운드 프린터 코드에서 이 Topic는 4개의 대기열만 만들었음을 관찰하고 메시지를 보낼 때 자동으로 Topic를 만들고 최대 4개의 대기열을 만들었음을 반복적으로 확인했다.
원인 찾기
서버와 클라이언트 설정 비교
원본 코드를 읽고 TopicConfig Manager의createTopicInSendMessageMethod 방법으로 TopicConfig 대상의 대기열 수와 클라이언트의 대기열 수를 비교하고 그 중 비교적 작은 자를 새 Topic 대기열 수로 설정하는 논리를 선택합니다.
int
queueNums = clientDefaultTopicQueueNums > defaultTopicConfig.getWriteQueueNums() ? defaultTopicConfig
.getWriteQueueNums() : clientDefaultTopicQueueNums;
포지셔닝 문제는 서비스 측 TopicConfig
다음 두 변수를 인쇄합니다.
고객 대기열 수clientDefaultTopicQueueNums가 8이고 정확합니다.
defaultTopicConfig.getWriteQueueNums()는 broker가 아닌 4입니다.properties에 설정된 16;
defaultTopicConfig에서 문제가 발생했음을 확인할 수 있습니다.
defaultTopicConfig 데이터 원본
defaultTopicConfig는 ConcurrentHashMap
TopicConfig defaultTopicConfig = this.topicConfigTable.get(defaultTopic);
defaultTopic 기본값은 MixAll입니다.DEFAULT_TOPIC=“TBW102”.
topicConfigTable에서 MixAll인지 확인하기 위해DEFAULT_TOPIC의 Config 대상 속성 값의 실제 원본을 계속 읽고 borker가 DEFAULT 를 두 군데 고친 것을 발견합니다TOPIC의 Config 객체 위치:
한 가지는 TopicConfig Manager의 구조 방법입니다.borker 서버가 시작될 때 실행되며,broker를 읽습니다.properties의 구성, DEFAULTTOPIC의 Config 대상에 있는DefaultQueueNums는 내가 설정한 16입니다.
한 가지는 Broker Controller의 initialize 방법에서 Topic Config Manager를 호출했습니다.load 방법:
이 load 메서드는 ConfigManager 클래스를 상속하여 $ROCKETMQ 를 읽었습니다.HOME\store\config에 저장된 구성 정보를 사용하고 추상적인 방법인 decode()를 호출하여 구성 정보를 json 문자열 매개 변수로 decode()에 전달합니다.
TopicConfig Manager 클래스의 decode 구현 방법에서 $ROCKETMQHOME\store\config\topics.json의 설정 정보를 topicConfigTable에 덮어쓰고 이전에 생성된 topics.json의'TBW102'설정 정보에 있는 writeQueueNums와readQueueNums는 모두 4입니다.
최종 결론
메시지를 보내면 자동으로 Topic을 만들 때 이전에 실행된borker 서버에 대해 설정 파일을 수정하는defaultTopicQueueNums 속성의 값이 작동하지 않습니다.
메시지를 보내면 자동으로 Topic을 만들 수 있기 때문에, 대기열은 비교 작업의 변수를 줄여서default TopicConfig를 topics에 씁니다.json의 설정 정보에 있는 writeQueueNums 및 readQueueNums는 Topics에서 읽습니다.json, 따라서 설정 파일을 수정하고borker 서버를 다시 시작해도 바뀌지 않습니다.서비스 측은 최종적으로 topics를 사용한다.json의 값은 메시지를 보낼 때 자동으로 Topic을 만들 때의 TopicConfig 설정 정보를 덮어씁니다.
아리의 해석
대기열은 자원이기 때문에 통제권은 서버에 맡긴다.
그러나 사용자마다 기본 정책이 다르기 때문에 기본 topic를 템플릿으로 하고 기본 topic를 만들기 전에 시스템이 자동으로 하나를 만듭니다.
이것은 운영 차원에서 생각할 수 있다. 예를 들어 당신이 10개의 그룹을 운영하여 1000명의 사용자에게 서비스를 제공했다.일부 사용자들은 topic를 동적으로 만들어야 하지만, 그에게 충분한 권한을 주지 못하고, 만들고 싶은 만큼 만들 수 있습니다.
그에게 템플릿을 줄 수 있는 모든 topic,default Topic입니다. 동적 생성 topic는default Topic 설정에 계승되며, 대기열 수는default Topic를 초과할 수 없습니다.
해결책
4
4
4
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux Ubuntu 15.04 단일 기기 설치 Alibaba RocketMQ 와 관련 RocketMQ 명령 사용전제조건: 자바 설치 (필수), Maven (원본 컴 파일, 그렇지 않 으 면 다운로드 하지 않 아 도 됩 니 다).자바 의 설 치 는 더 이상 설명 하지 않 습 니 다. 설치 후 환경 변 수 를 설정 해 야 합 니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.