【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 【RocketMQ系列十二】RocketMQ集群核心概念之主从复制&生产者负载均衡策略&消费者负载均衡策略

本文将介绍详细介绍RocketMQ集群中的几个核心概念,首先会介绍集群的主从复制,接着会介绍生产者负载均衡策略以及消费者的负载均衡策略。

1. 主从复制

RocketMQ提供了三种集群搭建方式。

  1. 2主2从同步复制方式( 2m-2s-sync)
    2主2从同步复制方式是本次集群搭建采取的方式。它使用同步复制的方式进行主从之间的数据复制,保证了消息的安全投递,不会丢失,但是会影响吞吐量。一般应用在对消息可靠性要求比较高的场景,比如订单系统,金融系统这种不容许消息数据丢失的场景。
    在RocketMQ中可以使用 ./conf/2m-2s-sync 文件夹内的配置文件做集群配置。
    在2主2从同步复制场景下,当生产者向broker集群中的某个broker的master节点的队列中写入消息之后,只有当消息被同步到该broker的slave节点之后,broker集群才会给生产者发送ack消息。就像下图中当消息被发送到  broker-a 的master节点之后,只有消息被同步到 broker-a的slave节点之后,broker集群才会向生产者发送ack消息。

  2. 2主2从异步复制方式(2m-2s-async)
    2主2从异步复制的方式即主从之间的数据复制采取的是异步复制的方式,这种方式相比于同步复制的方式吞吐量有提升,但是可能会丢失消息。
    在RocketMQ中可以使用 ./conf/2m-2s-async 文件夹内的配置文件做集群配置。
    在2主2从异步复制场景下,当生产者向broker集群中的某个broker的master节点的队列中写入消息之后,broker集群才会给生产者发送ack消息。就像下图中当消息被发送到  broker-a 的master节点之后,broker集群就会向生产者发送ack消息。

  3. 2主无从方式(2m-noslave)
    2主无从的方式由于没有从服务器,所以,不存在主从之间的数据复制,一般在生产环境不会被采用,因为主服务器一旦宕机,消息就有可能会丢失。
    在RocketMQ中可以使用 ./conf/2m-noslave 文件夹内的配置文件做集群配置。

2. 生产者负载均衡策略

生产者的负载均衡策略其实就是说生产者在发送消息时如何选择队列的。查看RocketMQ的源代码可以发下生产者采取的是轮询的方式。

int index = Math.abs(sendQueue.incrementAndGet() % messageQueueList.size());
                MessageQueue mq = messageQueueList.get(index);

详细介绍可以查看 【RocketMQ系列七】消费者和生产者的实现细节 本文。

3. 消费者负载均衡策略

在RocketMQ中,Consumer端的两种消费模式(Pull/Push)都是基于拉模式来获取消息的,而在Push模式只是对Pull模式的一种封装,其本质实现为消息拉取线程在从服务器上拉取到一批消息后,提交到消息消费线程池,然后,又"马不停蹄"继续向服务器再次常识拉取消息。如果没有拉取到消息,则延迟一下又继续拉取。

在两种基于拉模式的消费方式(Pull/Push)中,均需要Consumer端知道从Broker端的哪个消息队列中去获取消息。所以,需要在Consumer端来做负载均衡,即Broker端中多个MessageQueue  分配给同一个ConsumerGroup中的哪些Consumer消息。

Consumer的负载均衡策略可以通过Consumer的api来进行设置。

consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueAveragelyByCircle());

所有负载均衡策略均实现了AbstractAllocateMessageQueueStrategy接口。RocketMQ提供了如下几个负载均衡策略。

  1. AllocateMachineRoomNearby:基于机房近侧优先级的代理分配策略。可以指定实际的分配策略。如果任何使用者在机房中活动,则部署在同一台机器中的代理的消息队列仅分配给这些使用者。否则,这些消息队列可以与所有消费者共享。
  2. AllocateMessageQueueAveragely: 平均哈希队列算法,给每个消费者平均分配MessageQueue。
  3. AllocateMessageQueueAveragelyByCircle: 循环平均哈希队列算法(轮询),依次给消费者组内的消费者分配MessageQueue。
  4. AllocateMessageQueueByConfig:不分配,通过指定MessageQueue列表来消费。
  5. AllocateMessageQueueByMachineRoom:机房哈希队列算法,如支付宝逻辑机房。
  6. AllocateMessageQueueConsistentHash:一致哈希队列算法,带有虚拟节点的一致性哈希环。

RocketMQ默认使用的是 AllocateMessageQueueAveragely。需要注意的是,在MessageQueue和Consumer之间一旦发生对应关系的改变,就会触发rebalance,进行重新分配。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
3天前
|
消息中间件 NoSQL 关系型数据库
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试&死信队列&幂等消息的出现以及处理
8 1
|
3天前
|
消息中间件 负载均衡 Apache
【RocketMQ系列七】消费者和生产者的实现细节
【RocketMQ系列七】消费者和生产者的实现细节
10 1
|
3天前
|
消息中间件 存储 Java
【RocketMQ 系列三】RocketMQ集群搭建(2m-2s-sync)
【RocketMQ 系列三】RocketMQ集群搭建(2m-2s-sync)
9 1
|
6天前
|
消息中间件 网络协议 物联网
消息队列 MQ产品使用合集之如何让消费者不从最开始进行消费,而是从最后一条消息开始消费
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
2月前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
72 0
|
2月前
|
负载均衡 应用服务中间件 API
Nginx配置文件详解Nginx负载均衡Nginx静态配置Nginx反向代理
Nginx配置文件详解Nginx负载均衡Nginx静态配置Nginx反向代理
73 4
|
22天前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
35 2
|
2月前
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了"http://"。修正方法是删除上游服务器列表和proxy_pass中的"http://"。问题解决后,Nginx服务应能正常启动。
119 4
解决nginx配置负载均衡时invalid host in upstream报错
|
8天前
|
JSON 负载均衡 算法
Nginx反向代理与负载均衡
Nginx反向代理与负载均衡
|
9天前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用