消息队列 - RocketMQ

1. 名词解释和概念

NameServer

  • 是一个无状态节点,可集群部署,节点之间无任何信息同步
  • 用于服务注册和发现,为 MQ 集群提供服务协调与治理
  • 记录并维护 Topic 和 Broker 的信息
  • 为生产者和消费者提供 Topic 的路由信息

无状态和有状态:
举例:用户登录完后,将用户信息保存在一个地方,供以后其他动作来获取这些数据来完成对应的操作。这个时候,如果有动作需要获取这些保存的用户信息才能完成,那么我们就称这个动作是有状态的。用于存放用户信息的地方叫做暂存区,共用一个暂存区的动作,称之为“上下文

现在我们给出无状态的概念:每次动作所需的数据全部由外界提供,服务端内部不做任何的暂存;并且请求可以提交到服务端的任意副本节点上,处理结果都是完全一样

拓展:为什么现在都说要做成无状态的呢?
在现在的分布式系统中,“有状态”也就意味着用户的请求发送到服务端的时候,服务端里都保存着这个用户的一些基本信息;在微服务的架构中,用户的一些基本操作和主要功能的操作可能是分散在不同的服务器中进行,那么用户的信息都保存在用于处理用户基本操作的服务器中;如果此时这台服务器宕机了,那么该用户的一些操作将没有办法同步到备份的服务器中,除非这台服务器实时与主服务器保持用户信息的同步。所以现在大多数主流的观点都说要做成无状态的方式
在无状态的方式下下,用户的信息会随着每次的请求发送到服务器,专业一点来说,就是每次需要处理的数据都通过上游的服务器放到参数中传进来
当然,无状态方式下也会有属于他的弊端,就是每次传输的网络数据包会比较大


Broker

  • RocketMQ 的核心,负责消息的接收,存储,拉取等功能
  • 分为 Master 和 Slave ,一个 Master 对应多个 Slave
  • 每个 Broker 都会与 NameServer 集群中的每个节点保持长连接,定时把 Topic 的信息同步到 NameServer
  • 在启动的时候,会首先向 NameServer 注册,然后同步 Topic 的路由信息

Producer生产者;用来构建并传输消息到服务端的实体


Consumer

  • 消费者;用来接收并处理消息的实体
  • Push Consumer:推消费者,会注册一个监听的接口,一旦监听到有消息,就会立马回调监听接口中的方法,让 broker 将消息推送过来
  • Pull Consumer:拉消费者,消息的拉取由应用控制;当应用需要消息时,才会去 broker 拉取消息

Topic主题

  • 消息的第一级类型
  • 是消息的逻辑分类,一个 Topic 可以分布在不同的 Broker 上,把一个 Topic 分布在一个 Broker 上的子体称为分片
  • 数据分片其实是指按照某种规则将存放在一个地方的数据分散的存放在多个数据节点中,这样在高并发的场景下,请求被分散到各个节点中,从而达到提升性能的目的

Message Queue

  • Topic 被划分为一个或多个子主题,称为 Message Queue
  • 一个 Topic 下,可以设置多个 Queue

Tags:是 Topic 下的第二级消息类型,可以使用 Tags 在同一个 Topic 下进行消息过滤

2. 架构图

在这里插入图片描述

3. 发送和消费流程

3.1 发送流程

在这里插入图片描述

注意:上面流程图中有一个寻找 “默认路由” 的操作
说明:如果一个消息中指定的 Topic ,没有找到对应的 Broker,那么这个时候会去寻找可以自动创建不存在 Topic 的 Broker,让这个 Broker 去创建不存在的 Topic ,然后再把消息发送至新的 Topic 中

但是这样会有一个弊端,设想:如果此时生产者在连续不断的发送消息,因为 Broker 并不是实时的把新的 Topic 路由信息同步给 NameServer 的,而是每隔一段时间同步一次。那么在没有同步的这段时间里,由于生产者还在不断发送消息,那么就有可能出现其他也可以自动创建新 Topic 的 Broker 也在自己那里创建该 Topic。这种情况是好的,这样当同步路由信息给 NameServer 时,下次就会有多个 Broker 去处理这个 Topic 的消息,达到负载均衡的效果。但是,如果生产者不是连续不断的发送,而是偶尔发一次,且间隔的时间大于每次 Broker 同步给 NameServer 的时间,那么在 NameServer 中只记录了只有这一个 Broker 可以处理该 Topic 下的消息,此时就达不到负载均衡的效果了

3.2 消费流程

3.2.1 消息获取

消费者消费消息有两种获取消息的方式:pushpull

push:推模式
pull:拉模式

顾名思义:推模式是 Broker 主动向 Consumer 推送消息;拉模式是 Consumer 根据需要,请求 Broker 将消息返回

实际上,push 和 pull 都是采用 Consumer 主动拉取的方式
push 模式下,其实是建立了一个长轮询的 pull 模式
两者的不同之处在于:push 模式下,如果 Broker 里没有数据,Broker 会阻塞该请求,直到有数据返回或者超过本次请求的时间才会返回;而 pull 模式下则不会对请求进行阻塞

3.2.2 消息消费

所谓消费:其实就是 Consumer 订阅关注的 Topic ,然后获取并消费消息

消费者通常是以一个集群的方式存在,相同 Group ID 的 Consumer 属于同一个集群,同一个集群下的 Consumer 的消费逻辑必须是一样的

消费模式分为两种:集群消费和广播消费
集群消费:任意一条消息只要被同一个集群下的 Consumer 消费过一次即可,集群下的 Consumer 平摊所有的消息,达到负载均衡的目的
广播消费:消息会推送给集群中所有的 Consumer,保证消息被每一个 Consumer 消费一次

4. 消息的种类

同步消息:指消息发送方发出数据后,会进入阻塞状态,直到 MQ 服务方发回响应消息
适用场景:重要通知消息的发送


异步消息:指发送方发出数据后,无需等接收方响应,继续发送下个数据包。在异步发送的模式下,用户端不需要等待服务器响应即可直接返回,通过回调接口接收服务器的响应结果并对其进行处理
适用场景:一般适用于处理的链路较长,对 RT时间 敏感的业务场景;比如大资料的上传等


单向消息:只负责发送消息,服务器的回应对其来说并不重要,只需保证消息发送出去了即可
适用场景:适用于耗时短,但对可靠性要求不高的场景


事务消息:RocketMQ提供分布式事务功能来保证业务员发送方和MQ消息的一致性,其本质是使用半消息(Prepared 消息和 Commit 消息)机制来实现
流程如下:

  1. 发送方向 RocketMQ 发送消息
  2. RocketMQ 将消息持久化之后,向发送方发送 ACK 信号,此时消息为 Prepared 消息
  3. 发送方开始执行本地事务逻辑,根据本地事务执行结果向 RocketMQ 提交二次确认(Commit 或是 Rollback),RocketMQ 收到 Commit 状态则将 Prepared 消息标记为可投递,订阅方最终将收到该消息;RocketMQ 收到 Rollback 状态则删除 Prepared 消息,订阅方将不会接受该消息

如果在上述流程的第2阶段,提交的二次确认最终未到达 RocketMQ,RocketMQ 会定时扫描消息集群中的事物消息,如果发现 Prepared 消息,会向消息发送者确认本地事务的最终执行结果;根据消息发送者的返回来决定是回滚消息还是继续发送确认消息,保证消息发送与本地事务的同时成功或失败

如果本地事务已经成功,且消息也发送成功,那么压力来到消费者这边
此时会有两个问题:消费失败和消费超时;消费超时的话,只需一直重试即可;消费失败的话,按照阿里提供的说法,需要“人工解决,RabbitMQ 并未提供回滚上述整个流程的机制

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

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

相关文章

就因为这7大误区,我自学好久,但编程迟迟不能入门!

学编程的误区 就因为这7大误区,自学编程迟迟不能入门! 觉得编程好难学的同学,评论区告诉我! 这一篇文章,告诉你。 我这么多年都踩过,哪些自学编程的坑! 如果你,也在自学编程&am…

港联证券|dmi指标的用法和实战技巧?

DMI指标是一种技术分析工具,可用于评估股票、期货和外汇市场的趋势强度。DMI指标由三条线组成,分别是DI(上升方向指标)、-DI(下降方向指标)和ADX(平均趋向指数)。在使用DMI指标之前&…

flutter开发实战-多语言flutter intl

flutter开发实战-多语言flutter intl 之前做的应用中有用到多语言,一直没有整理,这里整理一下多语言设置流程。 使用的是Android studio 一、flutter_intl 插件 使用Android studio安装flutter_intl 插件,更新或者安装flutter_intl 插件后…

HTML案例:滚动条下拉后导航栏有网格状效果

案例&#xff1a;在滚动条下拉的时候&#xff0c;导航栏是固定的&#xff0c;当下拉卷出的内容在导航条的范围内时&#xff0c;导航条的背景虚化为卷出的内容 固定定位的效果 需求效果&#xff1a; 1、HTML代码 <style>* {margin: 0;padding: 0;}nav {/* 固定定位 */pos…

用 Nginx 禁止国外 IP 访问我的网站...

先来说说为啥要写这篇文章&#xff0c;之前看了下 Nginx 的访问日志&#xff0c;发现每天有好多国外的 IP 地址来访问我的网站&#xff0c;并且访问的内容基本上都是恶意的。因此我决定禁止国外 IP 来访问我的网站。 想要实现这个功能有很多方法&#xff0c;下面我就来介绍基于…

PHP实战开发26-使用PHP生成图片验证码并进行校验

文章目录 一、前言二、什么是验证码&#xff1f;三、PHP生成验证码图像3.1 生成验证码文字3.2 创建图像并绘制验证码文字3.3 将验证码存储到Session中 四、前端使用jQuery验证输入4.1 步骤一&#xff1a;创建HTML结构和CSS样式4.2 使用jQuery发送AJAX请求进行校验4.3 步骤三&am…

docker的联合文件系统 UnionFS《深入docker底层原理》

介绍 docker最大的贡献就是定义了容器镜像的分层的存储格式&#xff0c;docker镜像技术的基础是联合文件系统(UnionFS)&#xff0c;其文件系统是分层的。这样既可以充分利用共享层&#xff0c;又可以减少存储空间占用。 联合挂载系统的工作原理&#xff1a;读&#xff1a;如果…

GPT API+自动化提高生产力

一、简介 一句话说明白&#xff0c;就是自动采集需求&#xff0c;通过GPT API传送给GPT&#xff0c;然后GPT加工后&#xff0c;输出结果&#xff0c;利用自动化工具进行回复/存储/发布&#xff0c;甚至调用手机硬件或者使用WEBHOOK&#xff0c;或者联动IFTTT触发智能硬件的应用…

计算机体系结构基础知识介绍之缓存性能的十大进阶优化之编译器优化和硬件预取(六)

优化七&#xff1a;编译器优化&#xff0c;降低miss率 处理器和主内存之间不断扩大的性能差距促使编译器编写者仔细检查内存层次结构&#xff0c;看看编译时优化是否可以提高性能。再次&#xff0c;研究分为指令缺失的改进和数据缺失的改进。接下来介绍的优化可以在许多现代编…

rocketMq消息队列原生api使用以及rocketMq整合springboot

rocketMq消息队列 文章目录 rocketMq消息队列一、RocketMQ原生API使用1、测试环境搭建2、RocketMQ的编程模型3、RocketMQ的消息样例3.1 基本样例3.2 顺序消息3.3 广播消息3.4 延迟消息3.5 批量消息3.6 过滤消息3.7 事务消息3.8 ACL权限控制 二、SpringBoot整合RocketMQ1、快速实…

某网站JS加密、OB混淆与CSS反爬实战分析

1. 写在前面 最近一段时间接触了一些小说网站的业务。发现很多的小说网站&#xff0c;甚至一些小站它们的安全防护措施做的都很到位&#xff01;例如上次说到的的五秒盾也是存在于一个小说小站。今天要讲的这个网站它集JS加密、ob混淆、CSS反爬于一体 目标站点&#xff1a; aH…

pytest自动化测试实战之执行参数

上一篇介绍了如何运行pytest代码&#xff0c;以及用例的一些执行规则&#xff0c;执行用例发现我们中间print输出的内容&#xff0c;结果没有给我们展示出来&#xff0c;那是因为pytest执行时&#xff0c;后面需要带上一些参数。 参数内容 我们可以在cmd中通过输入 pytest -h…