RocketMQ客户端PUSH消费如何实现负载均衡


这篇文章将为大家详细讲解有关Rocket 香港云主机MQ客户端PUSH消费如何实现负载均衡,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.主题队列是如何分配的?
2.什么时候会进行负载均衡?
3.负载均衡后是否会导致消息重复消费1.初始化链条2.启动链条小结:从初始化链和调用链可以看出RebalanceService为线程类,随着消费启动时而启动,消费不退出则一直运行着。三、负载均衡流程
1.负载均衡链条2.负载均衡流程小结:在负载均衡时,会循环该消费组订阅的所有Topic都会执行负载均衡。

3.更新缓存processQueue流程小结:
1. 更新缓存时如果消费组订阅的队列不在新分配的队列集合中或者队列拉取时间超时失效,则将快照ProcessQueue设置为丢弃。
2. 消费拉取时判断ProcessQueue为丢弃,则不再对该队列拉取。
3. 顺序消费时如果获取消费锁成功,表明此队列空闲没有被消费,此时向Broker发起解锁请求,解锁成功后将该队列从缓存(processQueueTable)移除。
4. 顺序消费时获取锁失败,表明正在消费则不从processQueueTable移除,由于ProcessQueue设置为丢弃,在顺序消费下次拉取时会退出该队列的拉取请求。4.向Broker发送心跳流程5.队列分配算法
负载均衡流程图中对clientId和分区队列的分配提交给分区算法执行,那该算法是如何运作的呢?接口AllocateMessageQueueStrategy队列分配策略提供五种分配算法实现:1.平均分配策略
AllocateMessageQueueAveragely2.环形分配策略
AllocateMessageQueueAveragelyByCircle3.机房分配策略
AllocateMessageQueueByMachineRoom4.一致性Hash分配策略 AllocateMessageQueueConsistentHash5.配置文件分配策略
AllocateMessageQueueByConfig
除此之外可以自定义分配算法,实现接口接口即可,默认使用平均分配算法,也是最常用的,下面以该算法看看如何工作的。代码不是很好阅读,看下面验证结果即可。
6.平均分配算法验证

只有一个clientId时分配情况
会把1个Broker的16个分区全部分配给该客户端,每隔20秒触发一次负载均衡。
currentCID=2.0.1.138@consumer01分到的队列为0~15新加入第二个client时
此时有两个clinetId分别为2.0.1.138@consumer01和2.0.1.138@consumer02,1个 Broker16个分区的分配情况。
currentCID=2.0.1.138@consumer01分到的分区为0~7
currentCID=2.0.1.138@consumer02分到的分区为8~16新加入第三个client时
此时有三个客户端2.0.1.138@consumer01、2.0.1.138@consumer02、2.0.1.138@consumer03,1个Broker的16个队列的分配情况。
currentCID=2.0.1.138@consumer01分到的队列0~5
currentCID=2.0.1.138@consumer02分到的队列6~10
currentCID=2.0.1.138@consumer03分到的队列11~151.主题队列是如何分配的?2.什么时候会进行负载均衡?备注:负载均衡线程每隔20秒执行一次,当有新客户端退出或者加入或者新的Broker加入或掉线都会触发重新负载均衡。3.负载均衡后是否会导致消息重复消费?备注:情况1: 并发消费可能导致消息被重复消费,看以下代码。//并发消费对结果的处理//ConsumeMessageConcurrentlyService#ConsumeRequestif (!processQueue.isDropped()) {
ConsumeMessageConcurrentlyService.this.processConsumeResult(status, context, this);} else { //被丢弃,消费进度不会更新 log.warn(“processQueue is dropped without process consume result.
messageQueue= {}, msgs={}”, messageQueue, msgs);}如果负载均衡前已分配的队列不在负载均衡后的新队列集合中,会丢弃该队列即:processQueue.isDropped()。而该队列可能已经被消费完了,在处理结果时被丢弃了,消费进度没有更新。别的消费客户端重新拉取该队列时造成重复消费。情况2: 顺序消费不会导致消息被重复消费关于“RocketMQ客户端PUSH消费如何实现负载均衡”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

相关推荐: HTML5中progress和meter控件怎么使用

这篇文章主要介绍“HTML5中progress和meter控件怎么使用”,在日常操作中,相信很多人在HTML5中progress和meter控件怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTML5中progress和…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/17 18:00
下一篇 08/17 18:11

相关推荐