消息消费负载和重新分布机制|学习笔记

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 快速学习消息消费负载和重新分布机制

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)消息消费负载和重新分布机制】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12502


消息消费负载和重新分布机制


负载均衡的过程与算法介绍

RocketMQ 消息队列重新分配是由 RebalanceService 线程负责的。线程的启动会随着MQClientinstance的启动而启动。

MQClientinstance  其中会有这么一行代码:

this.rebalanceService.start();

也就是start会启动 rebalanceService 线程。

这个线程在启动之后,就会去调用客户端的  dorebalance  方法,下面是这个方法的代码:

public void doRebalance(){

for (Map.Entry entry : this.consumerTable.entryset()){

MQConsumerInner impl = entry .getValue();

if ( impl !=null){

try {  impl.doRebalance();

catch ( Throwable e) {

log.error( "doRebalance exception", e);}

它会进行负载均衡,重新分布的时候,以上代码部分会去遍历每个主题的订阅的队列,然后重新进行一个负载啊,所以整个地方是根据主题的一个订阅信息。然后会去遍历,针对每一个消费方去进行一个负载。

image.png进入  doRebalance  之后,发现有两种方式,一种是推送方式(DefaultMQPushConsumerImpl),一种是拉取方式(DefaultMQPullConsumerImpl),

推送方式。代码如下:

public void doRebalance(final boolean isOrder) {

Map subTable = this.getSubscriptionInner();

if ( subTable != null){

for (final Map.Entry entry : subTable.entrySet()){

final String topic = entry.getKey();

try {

this.rebalancByTopic(topic, isOrder);

}catch (Throwable e) {

if(!topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)){

Log.warn("rebalanceByTopic Exception", e);}

真正的负载会根据主题(Topic)去进行负载,这个地方传了一个topic, 所以进入 rebalanceByTopic,

负载均衡对于广播模式(messageModel)来讲其实没有太大的意义,因为广播模式的每一个客户端都要去消费当前主题下所有的队列,最多做更新的处理。

case CLUSTERING:{

Set mqSet = this.topicSubscribeInfoTable.get(topic);

List cidAll =

this.mQClientFactory.findConsumerIdList(topic,consumerGroup);

if(null == mqSet){

if (!topic.startsWith(MixAll.RETRY_GROUP_TOPIC_PREFIX)){

Log.warn("doRebalance,{},but the topic[{}] not exist.",

consumerGroup,topic);}

}

if(null == cidAll){

log.warn("doRebalance, {} {},get consumer id list failed", consumerGroup,topic);}

而真正的负载均衡是发生在集群模式下。它首先是拿到当前主题的这个队列(topic),再去拿到 cidAll ,也就是当前的所有主题客户端,

如下两个进行排序:

Collections.sort(mqAll)  Collections.sort(cidAll);

排完序之后,根据负载均衡的策略去进行一个重新的一个分布。

负载均衡的策略有五种。比较常用的有两种,一种叫做AllocateMessageQueueAveragely,另外一种就是AllocateMessageQueueAveragelyByCircle。

RocketMQ 默认提供5中负载均衡分配算法,下面是常见的两种:

AllocateMessageQueueAveragely : 平均分配

举例:8个队列q1,q2,q3,q4, q5 ,q6 ,q7,q8 ,消费者3个:c1,c2,c3分配如下:

c1:q1,q2 ,q3; c2:q4, q5 ,q6;c3:q7,q8

AllocateMessageQueueAveragelyByCircle:平均轮询分配

举例:8个队列q1,q2,q3,q4, q5 ,q6,q7 ,q8 ,消费者3个:c1,c2,c3分配如下:

c1:q1,q4 ,q7;c2:q2,q5,q8;c3:q3, q6

这两种的区别是:举一个例子:比如现在有八个队列,三个消费者,如果是第一种方式,真正负载的情况是:就是 C1 客户端负责消费一23,C2 负责消费456,C3 负责消费78;如果是第二种方式,在这种情况下,它的这三个消费者的负载是这样的: C1负责消费 Q1,Q4,Q7。C2 负责消费258, C3 负责消费36,它是一个循环的过程。这是两种比较常用的负载均衡的方式,在 MQ 当中这两种方式都可以使用。

注意事项:消息队列的分配遵循一个消费者可以分配到多个队列,但是同一个消息队列只能分配给一个消费者。所以如果出现消费者的个数大于队列的个数,那有些消费者就无法消费消息。以上就是关于负载均衡的过程以及具体负载均衡的算法。

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
10月前
|
数据采集 测试技术 Python
自动化淘宝秒杀:使用Selenium WebDriver的实战指南
本文详细介绍了如何利用Selenium WebDriver自动化淘宝秒杀操作,包括环境配置、代码实现及注意事项,旨在帮助读者提升秒杀成功率,同时提醒合理使用以遵守平台规则。
466 8
|
9月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
294 7
Spring Boot 入门:简化 Java Web 开发的强大工具
|
9月前
|
开发者
阿里云开发者社区入选 2024 中国技术品牌影响力企业榜
阿里云开发者社区入选 2024 中国技术品牌影响力企业榜。
|
10月前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
149 11
|
9月前
|
Java 数据库连接 数据库
Spring Batch 中的 Tasklet 是什么?
Spring Batch 中的 Tasklet 是什么?
473 2
|
9月前
|
移动开发 jenkins 持续交付
jenkins配置git
通过上述步骤,您可以在 Jenkins 中成功配置 Git,从而实现自动拉取代码并进行构建和部署。这些配置不仅提高了开发效率,还保证了代码的连续集成和交付。确保每一步配置正确,以避免在实际使用中遇到问题。
644 1
|
10月前
|
人工智能 弹性计算 网络安全
一键玩转CoAI:AI工程变现新模式
CoAI是一款强大的AI管理软件,支持多种大模型如OpenAI、通义千问等,具备丰富的UI设计、多模型管理、弹性计费等功能,既适合个人使用也支持企业级部署,帮助用户轻松管理和商业化AI能力。
|
10月前
|
数据采集 Java Python
爬取小说资源的Python实践:从单线程到多线程的效率飞跃
本文介绍了一种使用Python从笔趣阁网站爬取小说内容的方法,并通过引入多线程技术大幅提高了下载效率。文章首先概述了环境准备,包括所需安装的库,然后详细描述了爬虫程序的设计与实现过程,包括发送HTTP请求、解析HTML文档、提取章节链接及多线程下载等步骤。最后,强调了性能优化的重要性,并提醒读者遵守相关法律法规。
272 0
|
12月前
|
JavaScript 前端开发 安全
js逆向实战之烯牛数据请求参数加密和返回数据解密
【9月更文挑战第20天】在JavaScript逆向工程中,处理烯牛数据的请求参数加密和返回数据解密颇具挑战。本文详细分析了这一过程,包括网络请求监测、代码分析、加密算法推测及解密逻辑研究,并提供了实战步骤,如确定加密入口点、逆向分析算法及模拟加密解密过程。此外,还强调了法律合规性和安全性的重要性,帮助读者合法且安全地进行逆向工程。
282 11
|
缓存 负载均衡 安全