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

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
😁 2. 毕业设计专栏,毕业季咱们不慌忙,几百款毕业设计等你选。
❤️ 3. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 4. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 5. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门

文章目录

    • 1. 主从复制
    • 2. 生产者负载均衡策略
    • 3. 消费者负载均衡策略

本文将介绍详细介绍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消息。

    RocketMQ集群架构-主从复制

  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消息。

    RocketMQ集群架构-主从复制-2m-2s-async

  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,进行重新分配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动驾驶之—车道线感知

零、前言 : 最近在学习自动驾驶方向的东西,简单整理一些学习笔记,学习过程中发现宝藏up 手写AI 一、视觉系统坐标系 视觉系统一共有四个坐标系:像素平面坐标系(u,v)、图像坐标系(x,y&#xff09…

开源WAF--Safeline(雷池)测试手册

长亭科技—雷池(SafeLine)社区版 官方网站:长亭雷池 WAF 社区版 (chaitin.cn) WAF 工作在应用层,对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果,使其免于受到黑客的攻击 1.1 雷池的搭建 1.1.1 配置需求 操作系统:Linux 指令架构&am…

【数据结构与算法】二叉树的运用要点

目录 一,二叉树的结构深入认识 二,二叉树的遍历 三,二叉树的基本运算 3-1,计算二叉树的大小 3-2,统计二叉树叶子结点个数 3-3,计算第k层的节点个数 3-4,查找指定值的结点 一,二叉…

Spring底层原理(二)

Spring底层原理(二) BeanFactory的实现 //创建BeanFactory对象 DefaultListableBeanFactory factory new DefaultListableBeanFactory(); //注册Bean定义对象 AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition(SpringConfig.class).set…

搭建Pytorch的GPU环境超详细

效果 1、下载和安装VS2019 https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/ 登录需要用户名和密码 安装后需要联网下载组件的,安装的时候要勾选使用C++的桌面开发 2、下载和安装显卡驱动 查看自己的显卡型号 从英伟达下载和安装最新驱动

Python学习笔记——MYSQL,SQL核心

食用说明:本笔记适用于有一定编程基础的伙伴们。希望有助于各位! SQL语言分类 SQL注释 库管理 表管理 数据操作 分组聚合 分页限制 需要注意的是关键字的顺序不可以错乱,否则会报错其中LIMIT关键字的n是指从第n个开始,m是指查…

【Zero to One系列】微服务Hystrix的熔断器集成

前期回顾: 【Zero to One系列】springcloud微服务集成nacos,形成分布式系统 【Zero to One系列】SpringCloud Gateway结合Nacos完成微服务的网关路由 1、hystrix依赖包 首先引入hystrix相关的依赖包,版本方面自己和项目内相对应即可&#…

Electron 学习

Electron基本简介 如果你可以建一个网站,你就可以建一个桌面应用程序。Eletron 是一个使用 JavaScript, HTML和 CSS等Web 技术创建原生程序的框架,它负责比较难搞的部分,你只需把精力放在你的应用的核心上即可。 Electron 可以让你使用纯 Jav…

kr第三阶段(二)32 位汇编

编译与链接 环境配置 masm32 masm32 是微软的 masm32 的民间工具集合。该工具集合除了 asm32 本身的汇编器 ml 外还提供了: SDK 对应的函数声明头文件和 lib 库。32 位版本的 link(原版本是 16 位,这里的 32 位版本的 link 来自 VC 6.0&a…

OS 处理机调度

目录 处理机调度的层次 高级调度 作业 作业控制块 JCB 作业调度的主要任务 低级调度 中级调度 进程调度 进程调度时机 进程调度任务 进程调度机制 排队器 分派器 上下文切换器 进程调度方式 非抢占调度方式 抢占调度方式 调度算法 处理机调度算法的目标 处理…

Python桌面应用之XX学院水卡报表查询系统(Tkinter+cx_Oracle)

一、功能样式 Python桌面应用之XX学院水卡报表查询系统功能: 连接Oracle数据库,查询XX学院水卡操作总明细报表,汇总数据报表,个人明细报表,进行预览并且支持导出报表 1.总明细报表样式 2.汇总明细样式 3.个人明细…

安卓使用android studio跨进程通信之AIDL

我写这篇文章不想从最基础的介绍开始,我直接上步骤吧. 1.创建服务端 1.1:创建服务端项目:我的as版本比较高,页面就是这样的 1.2:创建AIDL文件,右键项目,选中aidl aidl名字可以自定义也可以默认 basicTypes是自带的,可以删掉,也可以不删,然后把你自己所需的接口写上去 1.3:创建…

微信小程序开发之后台数据交互及wxs应用

目录 一.后端准备 1.1. 应用配置 1.2. 数据源配置 二、数据库 2.1. 创建 2.2.数据表 2.3.数据测试 三、前端 3.1.请求方法整合 3.2.数据请求 3.3.WXS的使用 3.4.样式美化 3.5. 页面 今天就到这里了哦,希望能帮到你哦!!&#xf…

解密Java中神奇的Synchronized关键字

文章目录 🎉 定义🎉 JDK6以前🎉 偏向锁和轻量级锁📝 偏向锁📝 轻量级锁📝 自旋锁📝 重量级锁🔥 1. 加锁🔥 2. 等待🔥 3. 撤销 🎉 锁优化&#x1f…

红队打靶:Misdirection打靶思路详解(vulnhub)

目录 写在开头 第一步:主机发现与端口扫描 第二步:Web渗透(80端口,战术放弃) 第三步:Web渗透(8080端口) 第四步:sudo bash提权 第五步:/etc/passwd利…

一文搞懂UART通信协议

目录 1、UART简介 2、UART特性 3、UART协议帧 3.1、起始位 3.2、数据位 3.3、奇偶校验位 3.4、停止位 4、UART通信步骤 1、UART简介 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信…

【c++Leetcode】141. Linked List Cycle

问题入口 思想:Floyds Tortoise and Hare 这个算法简单来说就是设置一个慢指针(一次移动一个位置)和一个快指针(一次移动两个位置)。在遍历过程中,如果慢指针和快指针都指向同一个元素,证明环…

spacy.load(“en_core_web_trf“)报错TypeError: issubclass() arg 1 must be a class

使用spacy时遇到的问题 写在最前面: 安装spacy和en_core_web_trf时需要保证二者版本一致 安装及查看对应spacy版本 安装 pip install spacy查看版本 import spacy spacy.__version__安装en_core_web_trf 直接安装(如果可以的话) pytho…

Flutter视图原理之StatefulWidget,InheritedWidget

目录 StatefulElement1. 构造函数2. build3. _firstBuild3. didChangeDependencies4. setState InheritedElement1. Element类2. _updateInheritance3. InheritedWidget数据向下传递3.1 dependOnInheritedWidgetOfExactType 4. InheritedWidget的状态绑定4.1. ProxyElement 在f…

.net6部署到linux上(CentOS Linux 7)

目录 一、先在linux上配置.net环境 添加 Microsoft 包存储库 安装 SDK 安装运行时 检查 SDK 版本可使用终端查看当前安装的 .NET SDK 版本。 打开终端并运行以下命令。 二、创建.net6 mvc项目 并发布 创建项目 修改默认端口 打包发布到文件夹 运行打包项目查看项目是否…