1、消息消费需要解决的问题
首先再次重复啰嗦一下RocketMQ消息消费的一些基本元素的关系
主题 ---》 消息队列(MessageQueue) 1 对多
主题 ----》 消息生产者,,,一般主题会由多个生产者组成,生产者组
主题 ---- 》 消息消费者,,一般一个主题也会被多个消费者消费
那消息消费至少需要解决如下问题:
1、一个消费组中多个消费者是如何对消息队列(1个主题多个消息队列)进
行负载消费的。
2、一个消费者中多个线程又是如何协作(并发)的消费分配给该消费者的
消息队列中的消息呢?
3、消息消费进度如何保存,包括MQ是如何知道消息是否正常被消费了。
4、RocketMQ 推拉模式实现机制
再提一个业界关于消费者与消息队列的消费规则
1个消费者可以消费多个消息队列,但一个消息队列同一时间只能被一个消费者消费,这又是如何实现的呢?
继续探讨消息分发与消费端负载均衡。
我们从上文知道,PullMessageService线程主要是负责pullRequestQueue中的PullResult,那问题来了,pullRequestQueue中的数据从哪来,在什么时候由谁来填充。
那我们就先沿着这条线索分析下去,看一下PullMessageService的pullReqestQueue添加元素的方法的调用链条如下:
也就是调用链:
RebalanceService. run()
MQClientInstance.doRebalance()
DefaultMQPulConsumerImpl.doRebalance()
RebalanceImpl.doRebalance()
RebalanceImpl.rebalanceByTopic
RebalanceImpl.updateProcessQueueTableInRebalance
RebalanceImpl.dispatchPullRequest
DefaultMQPushConsumerImpl.executePullRequestImmediately
PullMessageService.executePullRequestImmediately
从上面可以直观的看出,向PullMesssageService 的 LinkedBl