【MQ学习笔记】RocketMQ知识分析与总结

RocketMQ

为什么使用mq?mq的作用?mq对你项目带来了什么?不选mq行不行?

  • 异步,MQ能够以异步的方式对消息进行处理,能够大大提高了系统的响应以及吞吐量
  • 解耦,MQ双方只需要负责生产或消费信息即可,生产者与消费者并没有捆绑关系,例如:项目中聊天微服务和连接微服务之间并没有捆绑,只需要处理好生产和消费的逻辑,底层的代码结构、运用的框架可以任意改变
  • 削峰,同任一时间段海量消息来的时候会导致流量激增,MQ的broker会对数据进行缓存,并不会因为消费者消费速度慢,导致消息丢失,具有一定的容灾性。例如:与三峡大坝的作用一样,水量激增也能保证下游的流速稳定

缺点:

  1. 系统可用性降低,过度依赖MQ,若MQ故障,那么依靠MQ进行通信的微服务也会失效
  2. 更加复杂,由原始的同步方式转换为异步,消息处理的逻辑并不是线性的了,需要解决额外产生的问题:
    1. 消息如何不丢失?
    2. 消息重复消费如何解决?
    3. 消息顺序性如何保证?
    4. 消息一致性如何保证?

你为什么会选择RocketMQ?Kafka怎么样?你对MQ是如何进行产品选型的?

基于面试的八股:

  • Kafka
    • 优点:吞吐量、性能市面最强
    • 缺点:但会造成一定的数据丢失并且功能比较单一
    • 使用场景:针对于大数据的处理
  • RabbitMQ
    • 优点:消息可靠性高,功能丰富
    • 缺点:吞吐量以及性能较差,因为会造成消息积累,导致性能不佳
    • 使用场景:流量小的场景
  • RocketMQ
    • 优点:综合了Kafka和Rabbit的优点,解决了其他MQ的缺点,拥有高性能、高吞吐、高可用、功能全面的特性
    • 缺点:客户端只支持Java,局限性较高

MQ如何保证消息不丢失的?MQ的消息是否会丢失,从架构原理层面分析一下?

首先,MQ消息可能丢失的地方以及对应处理方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UzKJV4d2-1679835634698)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230325123224320.png)]

  1. 生产消息,将消息通过网络发送给MQ时(保证消息能抵达MQ)

    • 消息发送+回调

    • ※ 事务消息 ※

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ToCJHu7A-1679835634699)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230325130416909.png)]

      整个流程:生产者会发送Half消息,MQ接收到Half消息并将Half消息存放到一个特殊的队列当中后进行响应,表示已经成功收到此消息。当生产者收到这个响应的同时会立马执行本地事务。接着会在指定的时间发送当前本地事务的状态:

      • 事务成功,则Half消息会先还原至原消息,然后就把原消息放入真正的topic所属的队列以及Half_op中,等待消费者消费
      • 事务失败,则Half消息就会被放入Half_op主题的队列当中,到时候后台服务扫描半消息时,就通过这个Half消息是否存在于此队列中,来判断这个消息是否已经处理过了
        • 为什么需要Half_op? 因为RocketMQ是顺序追加写入,所以不会更改已经入盘的half消息,而回查机制是将已经入盘的half消息进行回查,若half消息已经被判定为成功或失败时也会被读取进行回查,则就冗余、没有必要了。所以必须要通过某个东西来记录half消息是否已经被处理过,于是这个东西就是 half_op,half_op中的消息都是已经处理过的了.
      • 事务未知,则MQ发起回查,执行4->5->6的操作,默认回查次数15次,超过则代表事务失败!
  2. 主从同步时(保证消息存在于主从节点中)

    • 异步、同步,同步保证不会丢失数据,但会降低吞吐量;异步反之

    • ※ Dledger集群-两阶段提交 ※

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMD9NcM6-1679835634699)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230325144938329.png)]

      D表示节点,M表示主节点,S表示从节点。当要进行主从同步时,节点会开始自动选举出一个主节点M,接着会将消息率先发送给主节点,主节点接收后,状态转为Uncommited并进行分发同步至其余从节点,当大部分从节点返回同步成功的消息后,则主节点状态转为commited,表示同步成功。(具体了解可以去看相关书籍)

  3. 刷盘时(保证消息成功入盘)

    • 同步刷盘、异步刷盘,同步保证不会丢失数据,但会降低吞吐量;异步反之
  4. MQ通过网络将消息发送给消费者时(保证消息成功被消费者接收)

    • 同步传送、异步传送,同步保证不会丢失数据,但会降低吞吐量;异步反之

如何保消息消费的幂等性?如何防止消息重复消费?

重复消费产生的例子:假设我们消费者拿到消息消费了,业务逻辑已经走完了,事务提交了,此时需
要更新 Consumer offset 了,然后这个消费者挂了,另一个消费者顶上,此时 Consumer offset 还没
更新,于是又拿到刚才那条消息,业务又被执行了一遍。于是消息又重复了。

RocketMQ会对每个消息进行分配MessageID,可以利用此方式作为判断是否消费过的依据

@中本聪:这个要看你的业务的

如果你的消息存储的数据是需要插入数据库的,那么你在生成消息时就把 id 生成好(消息的数据中包含 id),在消费时可以通过 id 先查询数据库中是否已经存在,已经存在则是之前已经处理过了。

  • 如果 id 不能提前生成,比如用的是自增长 id,也可以考虑加一个有唯一值的字段,提前先用 uuid 生成这个字段的值,在消息的数据中存储这个值。

  • 如果是统计阅读时长之类的业务,定时发一次请求,然后累计时间。消息中肯定有用户 id,在消费时可以查找用户最后的记录,如果用户最后的在线记录中的时间段已经覆盖了消息数据中记录的时间,说明消费已经处理过了,不用再处理。

如何保证消息的顺序?为什么要保证消息顺序?

消息顺序分为两种:

  1. 全局顺序:所有经过消息队列的消息都要保证先进先出的规则
  2. 局部顺序:同一组经过消息队列的消息都要保证先进先出的规则

各MQ实现消息顺序的大致流程:

  • RocketMQ:生产者将一组有序消息发送到同一个MessageQueue里,指定一个消费者消费完这组消息,即可保证局部顺序
  • Kafka:生产者通过定制partition分配规则,将消息分配到同一个partition,Topic下只对应一个消费者
  • RabbitMQ:要保证目标exchange只对应一个队列。并且一个队列只对应一个消费者。

如何保证消息的高效读写?消息的读写性能怎么样?还能进一步优化吗?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tsMMRPsN-1679835634699)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230326100409505.png)]

借用 [小林coding](9.1 什么是零拷贝? | 小林coding (xiaolincoding.com)) 这张图可以知道,当用户程序要对消息进行读写时:

  1. 调用read,进行用户态和内核态进行切换、
  2. CPU发送指令告知要读取的文件内容,交给DMA进行拷贝至内核缓冲区(此时CPU是可以去执行其他任务的),当内核缓冲区拷贝好之后,DMA会发起中断通知CPU------------第一次数据拷贝
  3. CPU则会将内核缓冲区的数据拷贝到用户缓冲区当中------------第二次数据拷贝
  4. 当用户程序对数据进行处理好之后,接着调用write函数,CPU则把用户缓冲区的数据拷贝到内核缓冲区(图中指socket缓冲区)------------第三次数据拷贝
  5. 内核缓冲区准保好数据之后,会通过DMA进行拷贝到指定区域(图中指网卡)------------第四次数据拷贝

综上,可以发现需要执行四次数据拷贝并且需要进行四次的用户态与内核态之间的转换,这都是很耗性能的操作,那为了提高性能可以通过减少拷贝和用户态内核态之间的转换次数,那么就引出了零拷贝

是的,如何保证消息高效读写?答案就是需要进行零拷贝。

零拷贝技术剖析:

零拷贝分为有两个函数:mmap 和 sendfile

先讲讲mmap:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLI1UveI-1679835634700)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230326102549980.png)]

过程如下:

  • 其中mmap是将内核缓冲区的地址映射到用户态的页表上(这里也是需要拷贝的,但是不是数据拷贝,而是地址空间,所以速度极快)
  • 用户可以直接对内核缓冲区的数据进行读写操作**---------减少了一次拷贝**
  • 接着,当调用write函数时,只需要将内核的缓冲区拷贝至对应的缓冲区即可(图中指socket缓冲区)

综上可以发现,一共只需要三次拷贝,但仍然需要四次用户态内核态的切换

接着是sendfile(需要Linux内核2.1以上):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8z3vodVe-1679835634700)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230326154141788.png)]

首先,它可以替代前面的 read()write() 这两个系统调用,这样就可以减少一次系统调用,也就减少了 2 次上下文切换的开销。其次,该系统调用,可以直接把内核缓冲区里的数据拷贝到 socket 缓冲区里,不再拷贝到用户态,这样就只有 2 次上下文切换,和 **3 次数据拷贝。

紧接着,如果网卡还支持SG-DMA的技术,则不仅会放弃使用CPU进行拷贝而且可以直接从内存缓冲区直接拷贝至网卡当中。在网络这一方面,又减少了一次拷贝,总共只需要两次拷贝两次用户态内核态切换,性能又一步提升!当然,这项技术的前提都需要Linux内核2.1以上的版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ls1OYFd-1679835634700)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20230326154636965.png)]

让你设计一个消息队列,你会如何设计?

答题思路:

  1. 从整体到细节,从业务场景到技术实现,BFS而不是DFS
  2. 以了解的市面上现有的MQ为基础

个人模拟的口水话:

首先需要明确地提出消息中间件的几个重要角色,分别是生产者、消费者、Broker、注册中心,而消息队列流转过程就是生产者发消息,通过消息队列中的broker暂存消息,接着消费者会通过broker取消息用于消费。那么注册中心用于服务发现可以采用市面流行的Nacos或者zookeeper,保证能够实时监控服务的上下线。底层的通信结构可以根据Netty进行实现,而为了保证数据的可靠性,可以采用多节点方式存储,主从同步采用一主多从方式,根据倾向于性能或数据可靠采用同步或异步的方式进行刷盘操作。并且主从节点可以通过选举算法来判定哪个为主哪个为从,而且当主节点挂了之后从节点顶上,保证消息队列的高可用。对了,文件的读写操作也可以进一步采取零拷贝的方式提高性能,进入提高整体吞吐量。

ChatGPT回答:

第一版:

如果您是指消息队列(MQ,Message Queue)系统的设计,那么以下是一些基本的设计方案和考虑因素:

  1. 选择适合你的技术栈:选择适合你的技术栈并支持你的需求的MQ软件,例如Apache ActiveMQ、RabbitMQ、Apache Kafka、Amazon SQS等。
  2. 设计消息格式:定义消息格式并确保消息可以正确地序列化和反序列化,以便消息可以在不同的平台和编程语言之间传递。
  3. 定义消息队列:根据你的需求定义消息队列,包括队列名称、最大容量、过期时间等等。
  4. 实现消息的发布和订阅:定义消息发布者和消息订阅者,并确保消息可以按照指定的规则正确地路由到相应的队列。
  5. 实现消息的确认机制:当一个消息被消费者成功消费后,要及时地将消息标记为已消费,以避免重复消费。
  6. 实现错误处理和故障恢复机制:当MQ出现故障或异常情况时,要有相应的错误处理和故障恢复机制,以确保系统的可靠性和可用性。
  7. 监控和日志记录:监控MQ的性能和运行情况,并记录日志以便于追踪和排查问题。
  8. 安全性和权限控制:确保MQ系统的安全性和权限控制,以避免未授权的访问和数据泄露。

这只是MQ设计中的一些基本考虑因素。具体的设计方案会根据您的实际需求和使用场景而有所不同。

第二版:

为了设计一个消息队列系统,可以考虑以下方面:

  1. 消息队列类型:选择适合业务需求的消息队列类型,例如点对点、发布/订阅、消息广播等。
  2. 消息传递协议:选择合适的消息传递协议,例如AMQP、MQTT等。
  3. 消息存储:选择合适的消息存储方案,可以考虑使用关系型数据库、NoSQL数据库、内存数据库等。
  4. 消息生产者和消费者:设计消息生产者和消费者的接口和实现,包括如何连接到消息队列、发送和接收消息、处理消息异常等。
  5. 消息路由和过滤:设计消息路由和过滤规则,以确保消息被正确地传递到目标接收者。
  6. 消息优先级:为消息设置优先级,以确保高优先级消息能够优先被处理。
  7. 消息确认和持久化:设计消息确认机制,保证消息不会被重复消费,并考虑消息持久化的方案,以保证消息不会因为系统故障而丢失。
  8. 消息监控和管理:设计消息队列监控和管理系统,包括消息队列性能监控、消息追踪、日志管理等。
  9. 安全性和权限控制:考虑消息队列的安全性和权限控制,确保消息传输过程中的数据安全和访问控制。
  10. 扩展性和高可用性:设计消息队列的扩展性和高可用性方案,以应对高流量和故障情况。

以上是设计消息队列系统的一些关键因素,具体实现可以根据业务需求和技术选型进行调整和优化。

消息不会因为系统故障而丢失。
8. 消息监控和管理:设计消息队列监控和管理系统,包括消息队列性能监控、消息追踪、日志管理等。
9. 安全性和权限控制:考虑消息队列的安全性和权限控制,确保消息传输过程中的数据安全和访问控制。
10. 扩展性和高可用性:设计消息队列的扩展性和高可用性方案,以应对高流量和故障情况。

以上是设计消息队列系统的一些关键因素,具体实现可以根据业务需求和技术选型进行调整和优化。

如有侵权和错误,请及时告知!

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

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

相关文章

销售数据分析方法、如何写好一个专题分析报告、Hive大数据知识体系教程、大数据分析平台总体架构方案……| 本周精华...

▲点击上方卡片关注我,回复“8”,加入数据分析领地,一起学习数据分析,持续更新数据分析学习路径相关资料~(精彩数据观点、学习资料、数据课程分享、读书会、分享会等你一起来乘风破浪~)回复“小飞象”&…

老杨刷完了23个跨年演讲,这6场最适合网工

晚上好,我是老杨。 放假放了一阵子,老杨闲着没事儿,一共刷了23个跨年演讲。 好的演讲,和一本好书一样,都是可以震荡灵魂的。 也知道最近大家都忙得很,这里推荐7个最值得一听的跨年演讲,贴心吧…

朱广权李佳琦直播掉线,1.2 亿人在线等

作者 | 胡巍巍 出品 | 程序人生(ID:coder_life) 原来央视爸爸也有掉线的时候。 4月6日晚间,“国民段子手”朱广权连麦李佳琦,给湖北做公益带货直播。 “小朱配琦”的神仙组合,让人大呼过瘾,该直…

“我让 AI 来处理我 24 小时的音频信息——这会是未来吗?”

整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 这几年 AI 发展和进化的速度,几乎可以用三个字来形容:杀疯了。 AI 下棋、AI 编程、AI 作画、AI 写小说、AI 预测蛋白质结构……当 AI 逐渐融入我们的生活,你是否设…

抗住百万人直播、被联合国推荐,起底飞书技术演进之路!

你去公司上班了吗? 随着近期接连不断传来的好消息,上班族开始关心起这问题来。但许多企业在相关政策的号召下,仍采取远程办公的方式。据艾媒咨询的数据显示,今年春节期间中国远程办公企业规模超过 1800 万家,远程办公人…

听8位淘宝工程师聊聊他们眼中的元宇宙 | 1024特辑

我们是技术工作者,致力于思考和创新,用代码去解决生活中的问题,为消费者的快乐和幸福而努力。 今天是1024程序员节,我们邀请了8位不同岗位的淘宝工程师,聊了聊他们眼中的未来消费生活,他们眼中的元宇宙&…

数字人的新革命,BAT的“冲高”战场

配图来自Canva可画 ChatGPT横空出世,让人们看到了数字人的另一种可能,将ChatGPT与虚拟数字人融合,研发出更加智能化、拟人化的虚拟数字人成为数字人厂商的新命题、新方向。 2月份,岭南股份、风语筑、开普云等10多家公司&#xf…

数字化直播沟通

目录 前言 一、介绍数字化(5-10分钟) 主播提问(王): 回答(向): 什么是数字化? 好的,我们来看下一个问题:什么是数字化转型? 好的…

部署React项目到云服务器(步骤清晰)

部署React项目到云服务器 前言(下载相关软件)开始部署服务器以及域名购买实例远程连接 或 XShell 7 远程连接服务器XShell 7 连接云服务器操作使用FileZilla将 打包后的 build(可能你们那里打包是dist)文件塞到服务器文件夹感谢看到这里!点个关注再走啊!…

云服务安装配置git

搭建网站,我们有时候是直接从github拉取代码,这就要配置git。 云服务器搭建网站还需要一些其他的基础配置,前面我们已经讲到,未进行配置的可以参考之前的文章。 云服务基本配置:腾讯云服务器小白保姆级教程_大鹏bmfm…

【回答问题】ChatGPT上线了!写出coco数据集的图像分类训练和预测函数代码?

写出coco数据集的图像分类训练代码 好的,我会尽力写出图像分类训练代码。首先,你需要准备好 COCO 数据集的图像和标签,并将其转换成适合你模型使用的格式。其次,你需要选择一个图像分类模型,并定义好模型的结构。接下来,你可以使用 PyTorch 等深度学习框架来实现训练代码…

服务器访问次数限制实现的思路

有个每分钟只能访问10次接口的需求,想到2个实现方法分享给大家,希望可以一起进步,一开始的思路是记录下用户访问的时间和次数,然后在写一些方法实现。最先想到是记录在数据库里,刚好数据库有记录访问日志的表&#xff…

若登陆账号错误次数过多则限制登陆一定时长(自定义时长)

前提须知:登陆拦截器此演示:登陆5次错误 则限制登陆时长5秒 业务层实现方法 在控制器中使用此方法,若判断用户账户和密码是否正确则返回用户对象定义session中的key为’count’定义一个日期对象存放时间,时间是当前时间的后5秒,将此时间存放进session中key为’time’中若登陆…

根据IP限制指定时间内访问接口的次数

在网上看见有人问一个问题:想限制一下某个接口在一分钟之内只能被同一个ip请求指定次数。 方法比较多,这里就用Redis做一个简单的限制。 大致逻辑: 把请求的ip作为key,请求次数作为value存储在Redis里面,第一次请求value为1&am…

openAI--十拳剑助你做AI时代的弄潮儿

AI它厉害(diao)吗? 最近大家玩chatgpt还好吗? 有被它的恋爱情商暴击到吗? 有没有觉得那在leetcode上所向无敌的技巧都是浮云吗? 今天,我为大家带来十个很好的AI平台。这一篇先介绍一下&…

虚拟数字人和GPT-4的结合,能否迎来新爆发?

最近,ChatGPT一直在互联网上狂飙,从 去年11月底推出到月活过亿,仅花了2个月的 时间。它既可以拥有美国的医学牌照、参加司法考试,又能写小说、编代码、查资料,还可 以陪你闲聊,你问它什么话题,它…

在一个领域里面发光、发热

大家好,这期分享一些好的公众号给家,希望对你以后成长路有所帮助,据我了解,公众号的作者都是在自己的领域里很努力,发光、发热,大家喜欢的都可以关注一下,支持一下,在此感谢大家的认…

低代码平台助力AIGC:让人工智能技术更加普及和高效

今年人工智能的风是吹了一波又一波,从ChatGPT到文心一言,短短四个多月的时间,GPT完成了从3.0、3.5到4.0的推新发布,一步步刷新了民众对于目前人工智能技术发展的认知底线,让人们直观地感受到了人工智能技术的蓬勃发展。…

开源大语言模型LLMs汇总

向AI转型的程序员都关注了这个号👇👇👇 大语言模型 大语言模型(LLM)是指使用大量文本数据训练的深度学习模型,可以生成自然语言文本或理解语言文本的含义。大语言模型可以处理多种自然语言任务,…

黑群辉DSM 6.2.3 系统安装

修改引导程序配置文件 首先我们可以使用ChipEasy芯片无忧查找U盘的VID和PID。 以下图为例,这个U盘的VID是0930,PID是6544。 请记录好这两个值。下面修改配置文件需要用到。 逻辑盘符 : E:\ 此分区容量: 7.2G 设备ID : VID 090C PID 2000 设备序列号: …