RocketMQ基础知识和常见问题

RocketMQ

是一个 队列模型 的消息中间件,具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发,在 2016 年底贡献给 Apache,成为了 Apache 的一个顶级项目。 在阿里内部,RocketMQ 很好地服务了集团大大小小上千个应用,在每年的双十一当天,更有不可思议的万亿级消息通过 RocketMQ 流转。

RocketMQ中的消息模型

RocketMQ 中的消息模型按 主题模型 实现的。对主题模型的实现,每个消息中间件的底层设计不同,就比如 Kafka 中的 分区RocketMQ 中的 队列RabbitMQ 中的 Exchange。

RocketMQ中的角色:

  • Producer Group 生产者组:代表某一类的生产者,比如我们有多个秒杀系统作为生产者,这多个合在一起就是一个 Producer Group 生产者组,它们一般生产相同的消息。
  • Consumer Group 消费者组:代表某一类的消费者,比如我们有多个短信系统作为消费者,这多个合在一起就是一个 Consumer Group 消费者组,它们一般消费相同的消息。
  • Topic 主题:代表一类消息,比如订单消息,物流消息等等

每个消费组在每个队列上维护一个消费位置。发布订阅模式中一般会涉及到多个消费者组,而每个消费者组在每个队列中的消费位置都是不同的。

一个主题有多个队列以提高并发能力。RocketMQ 通过使用在一个 Topic 中配置多个队列并且每个队列维护每个消费者组的消费位置 实现了 主题模式/发布订阅模式。

RocketMQ架构

RocketMQ 技术架构中有四大角色 NameServerBrokerProducerConsumer。

Broker:存数据

一个 Topic 分布在多个 Broker上,一个 Broker 可以配置多个 Topic ,它们是多对多的关系。

NameServer:一个注册中心,主要提供两个功能:Broker 管理路由信息管理。

Producer:生产消息

Consumer:消费消息

Broker 需保证高可用,只使用一个broker压力会很大,需要使用多个 Broker 来保证负载均衡。消费者生产者直接和多个 Broker 相连,当 Broker 修改时,会牵连着每个生产者和消费者,产生耦合。

Broker 做了集群且进行主从部署 ,由于消息分布在各个 Broker 上,一旦某个 Broker 宕机,则该Broker 的消息读写会受到影响。 Rocketmq 提供了 master/slave 的结构,salve 定时从 master 同步数据,如果 master 宕机,则 slave 提供消费服务,但是不能写入消息。

 NameServer 也做集群部署,以保证 HA但 去中心化 ,即没有主节点。 RocketMQ 中, 单个 Broker 和所有 NameServer 保持长连接 ,并且每隔 30 秒 Broker 会向所有 Nameserver 发心跳,心跳包含自身的 Topic 配置信息 。

在生产者向 Broker 发送消息先从 NameServer 获取关于 Broker 的路由信息,然后通过 轮询向每个队列中生产数据以保证负载均衡

消费者通过 NameServer 获取所有 Broker 的路由信息,向 Broker 发送 Pull 请求来获取消息数据。Consumer 可以以两种模式启动—— 广播(Broadcast)和集群(Cluster)。广播模式下,一条消息会发送给 同一个消费组中的所有消费者 ,集群模式下消息只会发送给一个消费者。

生产者和消费者分组

生产者分组:RocketMQ 5.x 版本,生产者是匿名的,无需管理生产者分组;历史版本3.x 和 4.x,已经使用的生产者分组可以废弃无需再设置,不会对当前业务产生影响。

消费者分组:是多个消费行为一致的消费者的负载均衡分组。

消费者分组中的订阅关系、投递顺序性、消费重试策略是一致的。

  • 订阅关系:Apache RocketMQ 以消费者分组的粒度管理订阅关系,实现订阅关系的管理和追溯。
  • 投递顺序性:Apache RocketMQ 的服务端将消息投递给消费者消费时,支持顺序投递和并发投递,投递方式在消费者分组中统一配置。
  • 消费重试策略: 消费者消费消息失败时的重试策略,包括重试次数、死信队列设置等

顺序消费

RocketMQ 在主题上是无序的,只在队列层面保证有序。

普通顺序是指消费者通过同一个消费队列收到的消息是有顺序的 ,不同消息队列收到的消息则可能是无顺序的。普通顺序消息在 Broker 重启情况下不会保证消息顺序性 (短暂时间)。

严格顺序是指消费者收到的所有消息均是有顺序的。严格顺序消息即使在异常情况下也会保证消息的顺序性

一般而言, MQ 能容忍短暂乱序,推荐使用普通顺序。

普通顺序模式时: Producer 生产消息,会进行轮询来向同一主题的不同消息队列发消息。若此时有几个消息分别是同一个订单的创建、支付、发货,在轮询的策略下,这三个消息会被发送到不同队列,导致无法使用一个队列的有序特性来保证消息有序。

解决方法:将同一语义下的消息放入同一个队列(比如这里是同一个订单),使用 Hash 取模法 来保证同一个订单在同一个队列中。

发送异常:

选择队列后会与 Broker 建立连接,通过网络请求将消息发送到 Broker 上,如果 Broker 挂了或者网络波动发送消息超时此时 RocketMQ 会进行重试。

重新选择其他 Broker 中的消息队列进行发送,默认重试两次,可以手动设置

producer.setRetryTimesWhenSendFailed(5);

消息过大:

消息超过 4k 时 RocketMQ 会将消息压缩后在发送到 Broker 上,减少网络资源的占用。

重复消费

问题:有一个积分系统,负责为用户加积分。消息队列发给订单系统 AAA 的订单信息,要求是给 AAA 的积分加上 500。积分系统收到 AAA 的订单信息,处理完后,返回处理成功信息给消息队列时,出现网络波动(或 Broker 意外重启等),这条回应没有发送成功。消息队列没收到积分系统的回应会尝试重发消息,导致又给 AAA 的账户加上 500 积分。

解决:给消费者实现 幂等 ,即对同一个消息的处理结果,执行多少次都不变。

如何实现:根据特定场景使用特定的解决方案。可以使用 写入 Redis 来保证,因为 Rediskeyvalue 天然支持幂等。还可使用 数据库插入法 ,基于数据库的唯一键来保证重复数据不会被插入多条。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 创建交换空间

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

明牌空投:Cosmos生态项目Joltify零撸教程

简介:Joltify Finance 是基于Cosmos SDK的Layer1公链,做RWA赛道的,它可以将加密世界中的大量流动性与现实世界的金融资产合并,将有形资产转换为代币或NFT的过程,使它们能够在链上进行交易,从而在DeFi和传统…

内存卡损坏怎么修复数据,内存卡损坏修复数据方法

内存卡损坏是许多用户都可能面临的问题。当我们的内存卡损坏时,其中存储的重要数据可能会受到威胁,承载着我们无尽回忆的数据,一旦失去,将成为大家心中永远的遗憾。因此我们迫切需要找到一种方法来修复这些数据。本文将介绍一些内存卡损坏修复数据方法,帮助大家解决因为内…

外卖店优先级c++

题目 输入样例: 2 6 6 1 1 5 2 3 1 6 2 2 1 6 2输出样例: 1样例解释 6时刻时,1 号店优先级降到 3,被移除出优先缓存;2 号店优先级升到 6,加入优先缓存。 所以是有 1 家店 (2 号) 在优先缓存中。 思路 …

严平稳随机过程、广义平稳随机过程、各态历经性

严平稳随机过程指的是所有统计特性均与时间起点无关,即时间平移不影响其任何统计特性。工程上解释即可以在任意时间点去测量信号的统计特性,不会因为测量的时间改变而产生影响。 广义平稳随机过程,常常称为平稳过程,指的是均值与自…

makefile编译第一讲

更多精彩内容在公众号。关注公众号,加v,免费送你两本makefile电子书。轻松掌握makefile 在C和C中,首先要把源文件编译成中间代码文件,在windows下就是obj文件,linux下就是.o文件:object file。这个动作叫做…

2.9 什么是A/B测试?如何进行A/B测试?

2.9 什么是A/B测试? 场景描述 在互联网公司中,A/B 测试是验证新模块、新功能、新产品是否有效,新算法、新模型的效果是否有提升,新设计是否受到用户欢迎,新更改是否影响用户体验的主要测试方法。在机器学习领域中&…

Google XSS Game Level 6 通关方式

文章目录 链接:[Google XSS Game](#https://xss-game.appspot.com/)Level 6 - Follow the 🐇思路1 (当然,我使用这个方式没有成功,所以才来记录下)解法2 【最简单的解法】需要注意的一个小问题 链接&#x…

C++入门笔记开源【研究生3年+7W字】

博主研究生3年时间积累了一个C的基础知识文档,共计7W字。几乎把常用的各种语法和接口都包含进去了。一个文档,markdown格式的,可以当做工具书来使用。由于本文档内容较多,直接复制到csdn会各种卡,而且图片链接不对&…

全智能深度演进,一键成片让视频创作颠覆式提效

全智能一键成片,让内容创作的「边际成本」逼近于零。 大模型和AIGC技术的发展,可以用“日新月异”来形容,其迭代速度史无前例,涌现出的各类垂直应用模型,也使得音视频行业的应用场景更加广泛和多样化。 然而&#xff…

PTA L2-027 名人堂与代金券

对于在中国大学MOOC(http://www.icourse163.org/ )学习“数据结构”课程的学生,想要获得一张合格证书,总评成绩必须达到 60 分及以上,并且有另加福利:总评分在 [G, 100] 区间内者,可以得到 50 元…

Unity vision pro模拟器开发教程-附常见问题解决方案

前言 庄生晓梦迷蝴蝶,望帝春心托杜鹃 废话 去年苹果发布会上,推出了Vision Pro这一款XR产品。并且宣布Unity作为其主要合作伙伴,负责开发XR的开发产品。 这消息一出,当晚Unity的股价直接被熔断。产品发布之后,一直等…

java篇 让java对象具有链式调用

一 操作 1.1 流程 1.在类中引入注解Accessors(chain true),引入后,不要在使用自定义的getter,setter方法 Data Accessors(chain true) public class Student {private String name;private int age;Overridepublic String toString() {r…

【模板】AcWing873. 《欧拉函数》(C++)

【题目描述】 给定 n 个正整数 ,请你求出每个数的欧拉函数。 欧拉函数的定义 【输入格式】 第一行包含整数 n。 接下来 n 行,每行包含一个正整数 。 【输出格式】 输出共 n 行,每行输出一个正整数 的欧拉函数。 【数据范围】 1≤n≤1…

opencv 十八 python下实现0缓存掉线重连的rtsp直播流播放器

使用opencv打开rtsp视频流时,会因为网络问题导致VideoCapture掉线;也会因为图像的后处理阶段耗时过长导致opencv缓冲区数据堆积,从而使程序无法及时处理最新的数据。为此对cv2.VideoCapture进行封装,实现0缓存掉线重连的rtsp直播流…

Mall 西瑾商城uniapp商城项目:一个全平台兼容的电商解决方案

一、引言 随着移动互联网的快速发展,电商行业正经历着前所未有的变革。在这个背景下,一个优秀的电商平台需要具备全平台兼容、高效的商品管理、用户友好的界面设计以及强大的消息和客服支持等功能。本文将详细介绍Mall 西瑾商城uniapp商城项目&#xff…

欣瑞达信息技术邀您莅临2024长三角快递物流展

2024数字物流技术展 2024新能源商用车及物流车展 2024电商物流包装展 2024冷链物流展 2024年7月8-10日 | 杭州国际博览中心 参展企业介绍 深圳市欣瑞达信息技术有限公司(曾用名:深圳市欣瑞达液晶显示技术有限公司)成立于1997年,是…

Gitlab的流水线任务【实现每小时自动测试 dev分支的更新】

背景 在现代软件开发实践中,持续集成(Continuous Integration, CI)是确保代码质量和快速响应软件缺陷的关键策略。GitLab 提供了强大的 CI/CD 功能,允许开发者自动化测试和部署流程。本文将介绍如何设置 GitLab 流水线计划任务&a…

Linux centos7安装nginx-1.24.0并且实现自启动

1.安装之前的操作 ps -ef|grep nginx 查看是否有运行 如果有就杀掉 kill -9 pid find / -name nginx 查看nginx文件 rm -rf file /usr/local/nginx* 通通删掉删掉 yum remove nginx 限载一下服务 1.2.下载安装包 地址 nginx: download 2.减压文件 tar…

浮点二分(求一个数的平方根)

问题&#xff1a;求一个浮点数的平方根&#xff0c;要求保留两位小数。 #include<iostream> #include<iomanip> using namespace std;int main(){double x;cin>>x;double L0,Rx;while(R-L>1e-4){//保留两位小数的精度&#xff0c;若要保留3位小数&#…