首页 > 其他分享 >RocketMq学习(一)

RocketMq学习(一)

时间:2024-11-26 23:00:53浏览次数:6  
标签:发送 Broker 学习 消息 Topic NameServer RocketMQ RocketMq

一、RocketMQ 介绍

MQ:消息中间件是什么?
消息中间件属于分布式系统中一个子系统,关注于数据的发送和接收,利用高效可靠的异步消息传递机制对分布式系统中的其余各个子系统进行集成。

消息队列RocketMQ 是阿里巴巴集团基于高可用分布式集群技术,自主研发的云正式商用的专业消息中间件,既可为分布式应用系统提供异步解耦。
和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性,是阿里巴巴双11 使用的核心产品。
RocketMQ 的设计基于主题的发布与订阅模式,其核心功能包括消息发送、消息存储(Broker)、消息消费,整体设计追求简单与性能第一。

1. NameServer 设计及其简单,RocketMQ 摈弃了业界常用的Zookeeper 充当消息管理的“注册中心”,而是使用自主研发的NameServer 来实现各种元数据的管理(Topic 路由信息等)。
2. 高效的I/O 存储,RocketMQ 追求消息发送的高吞吐量,RocketMQ 的消息存储设计成文件组的概念,组内单个文件固定大小,引入了内存映射机制,所有主题的消息存储基于顺序读写,极大提高消息写性能,同时为了兼顾消息消费与消息查找,引入消息消费队列文件与索引文件。
3. 容忍存在设计缺陷,适当将某些工作下放给RocketMQ 的使用者,比如消息只消费一次,这样极大的简化了消息中间件的内核,使得RocketMQ的实现发送变得非常简单与高效。

一、核心流程图

二、NameServer

NameServer 是整个RocketMQ 的“大脑”,它是RocketMQ 的服务注册中心,所以RocketMQ 需要先启动NameServer 再启动Rocket 中的Broker。

Broker 在启动时向所有NameServer 注册(主要是服务器地址等),生产者在发送消息之前先从NameServer 获取Broker 服务器地址列表(消费者一样),然后根据负载均衡算法从列表中选择一台服务器进行消息发送。 

NameServer 与每台Broker 服务保持长连接,并间隔30S 检查Broker 是否存活,如果检测到Broker 宕机,则从路由注册表中将其移除。这样就可以实现RocketMQ 的高可用。

三、主题

消息主题,Topic,一级消息类型,生产者向其发送消息。消费者负责从Topic 接收并消费消息。

四、生产者

生产者:也称为消息发布者,负责生产并发送消息至Topic。

五、消费者

消费者:也称为消息订阅者,负责从Topic 接收并消费消息。

六、消息

消息:生产者或消费者进行消息发送或消费的主题,对于RocketMQ 来说,消息就是字节数组。

七、RocketMq流程总结

以下我们将总结下Rocket 的整体运转。
1. NameServer 先启动
2. Broker 启动时向NameServer 注册
3. 生产者在发送某个主题的消息之前先从NamerServer 获取Broker 服务器地址列表(有可能是集群),然后根据负载均衡算法从列表中选择一台Broker 进行消息发送。

4. NameServer 与每台Broker 服务器保持长连接,并间隔30S 检测Broker 是否存活,如果检测到Broker 宕机(使用心跳机制,如果检测超过120S),则从路由注册表中将其移除。
5. 消费者在订阅某个主题的消息之前从NamerServer 获取Broker 服务器地址列表(有可能是集群),但是消费者选择从Broker 中订阅消息,订阅规则由Broker 配置决定。

二、RocketMQ 的设计理念和目标

一、设计理念

基于主题的发布和订阅,其核心功能,消息发送、消息存储和消息消费。整体设计追求简单与性能。
NameServer 性能对比Zookeeper 有极大的提升;

高效的IO 存储机制,基于文件顺序读写,内存映射机制

容忍设计缺陷,比如消息只消费一次,Rocket 自身不保证,从而简化Rocket 的内核使得Rocket 简单与高效,这个问题交给消费者去实现(幂等)。

二、设计目标

架构模式:发布订阅模式,主要组件:消息发送者、消息服务器(消息存储)、消息消费、路由发现。
顺序消息:RocketMQ 可以严格保证消息有序
消息过滤:消息消费是,消费者可以对同一主题下的消息按照规则只消费自己感兴趣的消息,可以支持在服务端与消费端的消息过滤机制。
消息存储:一般MQ 核心就是消息的存储,对存储一般来说两个维度:消息堆积能力和消息存储性能。RocketMQ 追求消息存储的高性能,引入内存映射机制,所有的主题消息顺序存储在同一个文件中。同时为了防止无限堆积,引入消息文件过期机制和文件存储空间报警机制。

消息高可用:

1. Rocket 关机、断电等情况下,Rokcet 可以确保不丢失消息(同步刷盘机制不丢失,异步刷盘会丢失少量)。

2. 另外如果Rocket 服务器因为CPU、内存、主板、磁盘等关键设备损坏导致无法开机,这个属于单点故障,该节点上的消息全部丢失,如果开启了异步复制机制,Rocket 可以确保只丢失很少量消息。
3. 如果引入双写机制,这样基本上可以满足消息可靠性要求极高的场景(毕竟两台主服务器同时故障的可能性还是非常小)

消息消费低延迟:RocketMQ 在消息不发生消息堆积时,以长轮询模式实现准实时的消息推送模式。
确保消息必须被消费一次:消息确认机制(ACK)来确保消息至少被消费一次,一般ACK 机制只能做到消息只被消费一次,有重复消费的可能。
消息回溯:已经消费完的消息,可以根据业务要求重新消费消息。
消息堆积:消息中间件的主要功能是异步解耦,还有个重要功能是挡住前端的数据洪峰,保证后端系统的稳定性,这就要求消息中间件具有一定的消息堆积能力,RocketMQ 采用磁盘文件存储,所以堆积能力比较强,同时提供文件过期删除机制。
定时消息:定时消息,定时消息是指消息发送到Rocket Broker 上之后,不被消费者理解消费,要到等待一定的时间才能进行消费,apache 的版本目前只支持等待指定的时间才能被消费,不支持任意精度的定时消息消费。(一个说法是任意精度的定时消息会带来性能损耗,但是阿里云版本的RocketMQ却提供这样的功能,充值收费优先策略?)
消息重试机制:消息重试是指在消息消费时,如果发送异常,那么消息中间件需要支持消息重新投递,RocketMQ 支持消息重试机制。

三、RocketMq 中消息的发送

普通消息是指消息队列RocketMQ 中无特性的消息,区别于有特性的定时/延时消息、顺序消息和事务消息。这些后续会细讲。
RocketMQ 发送普通消息有三种实现方式:单向(OneWay)发送、可靠同步发送、可靠异步发送。

一、单向发送 

单向(Oneway)发送特点为发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答。此方式发送消息的过程耗时非常短,一般在微秒级别。

 一、Producer Group(生产者分组)

生产者组,简单来说就是多个发送同一类消息的生产者称之为一个生产者组。在这里可以不用关心,只要知道有这么一个概念即可。RocketMQ 中的生产者组只能有一个在用的生产者。分组的作用如下(简单的场景不需要了解这个概念):

1. 标识一类Producer
2. 可以通过运维工具查询这个发送消息应用下有多个Producer 实例
3. 发送分布式事务消息时,如果Producer 中途意外宕机,Broker 会主动回调Producer Group 内的任意一台机器来确认事务状态。

二、Producer实例

Producer 的一个对象实例,不同的Producer 实例可以运行在不同进程内或者不同机器上。Producer 实例线程安全,可在同一进程内多线程之间共享。

三、Message Key

Key 一般用于消息在业务层面的唯一标识。对发送的消息设置好Key,以后可以根据这个Key 来查找消息。比如消息异常,消息丢失,进行查找会很方便。RocketMQ 会创建专门的索引文件,用来存储Key 与消息的映射,由于是Hash 索引,应尽量使Key 唯一,避免潜在的哈希冲突。
Tag 和Key 的主要差别是使用场景不同,Tag 用在Consumer 代码中,用于服务端消息过滤,Key 主要用于通过命令进行查找消息
RocketMQ 并不能保证message id 唯一,在这种情况下,生产者在push 消息的时候可以给每条消息设定唯一的key, 消费者可以通过message key保证对消息幂等处理。

四、Tag

消息标签,二级消息类型,用来进一步区分某个Topic 下的消息分类。
Topic 与Tag 都是业务上用来归类的标识,区分在于Topic 是一级分类,而Tag 可以理解为是二级分类。
以天猫交易平台为例,订单消息和支付消息属于不同业务类型的消息,分别创建Topic_Order 和Topic_Pay,其中订单消息根据商品品类以不同的Tag再进行细分,如电器类、男装类、女装类、化妆品类,最后他们都被各个不同的系统所接收。
通过合理的使用Topic 和Tag,可以让业务结构清晰,更可以提高效率。
您可能会有这样的疑问:到底什么时候该用Topic,什么时候该用Tag?
1)消息类型是否一致:如普通消息、事务消息、定时(延时)消息、顺序消息,不同的消息类型使用不同的Topic,无法通过Tag 进行区分。
2)业务是否相关联:没有直接关联的消息,如淘宝交易消息,京东物流消息使用不同的Topic 进行区分;而同样是天猫交易消息,电器类订单、女
装类订单、化妆品类订单的消息可以用Tag 进行区分。

3)消息优先级是否一致:如同样是物流消息,盒马必须小时内送达,天猫超市24 小时内送达,淘宝物流则相对会慢一些,不同优先级的消息用不
同的Topic 进行区分。
4)消息量级是否相当:有些业务消息虽然量小但是实时性要求高,如果跟某些万亿量级的消息使用同一个Topic,则有可能会因为过长的等待时间
而“饿死”,此时需要将不同量级的消息进行拆分,使用不同的Topic。

二、可靠同步发送

同步发送是指消息发送方发出数据后,同步等待,直到收到接收方发回响应之后才发下一个请求。

 一、Message ID

消息的全局唯一标识(内部机制的ID 生成是使用机器IP 和消息偏移量的组成,所以有可能重复,如果是幂等性还是最好考虑Key),由消息队列MQ系统自动生成,唯一标识某条消息。

二、SendStatus

发送的标识。成功,失败等

三、Queue

RocketMQ 收到消息后,所有主题的消息都存储在commitlog 文件中,当消息到达commitlog 后,将会采用异步转发到消息队列,也就是consumerqueue,
Queue 是数据分片的产物,数据分片可以提高消费者的效率。

三、可靠异步发送

消息发送方在发送了一条消息后,不等接收方发回响应,接着进行第二条消息发送。发送方通过回调接口的方式接收服务器响应,并对响应结果进行处理

四、三种方式的对比

 

标签:发送,Broker,学习,消息,Topic,NameServer,RocketMQ,RocketMq
From: https://blog.csdn.net/qq_40228720/article/details/144067728

相关文章

  • 使用Python实现智能食品安全追溯系统的深度学习模型
    食品安全一直是社会关注的重大问题,尤其在全球化供应链日益复杂的今天,食品安全追溯系统显得尤为重要。通过智能食品安全追溯系统,可以有效追溯食品来源、流通路径,及时发现和处理食品安全问题。本文将详细介绍如何使用Python构建一个智能食品安全追溯系统的深度学习模型,并通过......
  • 使用Python实现智能食品供应链优化的深度学习模型
    在现代食品工业中,供应链的优化对于保证食品质量、降低成本和减少浪费至关重要。通过深度学习技术,可以实现智能化的供应链优化,有效提升供应链的效率。本文将详细介绍如何使用Python构建一个智能食品供应链优化的深度学习模型,并通过具体代码示例展示实现过程。项目概述本项......
  • java学习03day
    Java的一些特性变量java的变量相对于c语言而言不能重复定义会爆错inte,f=30;上述的代码相当于f为30,e没有进行复制强类型语言:每个变量都必须声明其类型数据类型数据类型分为:1、基本数据类型:数值型(整数类型(byte、short、int、long)浮点类型(float、double))、字符型(char)、布......
  • JAVA JNDI学习
    概述临时记录以下JNDI注入的学习笔记,最近学的东西太多了,感觉知识要不进脑子了,学的东西并没有完全理解,对原理还有应用的攻击手法理解都不是很深......推荐先理解JNDI的基本概念,然后再去学习JNDI的原理以及注入什么的,要不然真的学起来非常难受......我这里是缝合了以下博客来总结......
  • python基础学习4
    打开文件的方式#第一种f=open('C:\project\pycharmprojects\\bigdata33\day05/cars.csv',mode='r',encoding='UTF-8')text=f.read()print(text)f.close()#第二种text=''withopen('C:\project\pycharmprojects\\b......
  • Java学习笔记——2024.11.26
    2024.11.26一、整数类型二、整数类型的使用细节intn1=1;longn2=1L;三、浮点数1.浮点数使用2.浮点数细节//2floatnum1=1.1//默认为double,但是没有写f,前面却定义了float类型,所以不允许。floatnum2=1.1F;//对的doublenum3=1.1;//对的doublenum4=1.1......
  • flink学习(8)——窗口函数
    增量聚合函数——指窗口每进入一条数据就计算一次例如:要计算数字之和,进去一个12计算结果为20,再进入一个7——结果为27 reduceaggregate(aggregateFunction)packagecom.bigdata.day04;publicclass_04_agg函数{publicstaticfinalTuple3[]ENGLISH=new......
  • flink学习(7)——window
     概述窗口的长度(大小):决定了要计算最近多长时间的数据窗口的间隔:决定了每隔多久计算一次举例:每隔10min,计算最近24h的热搜词,24小时是长度,每隔10分钟是间隔。窗口的分类1、根据window前是否调用keyBy分为键控窗口和非键控窗口2、根据window中参数的配置分为基于时间......
  • 防止思维僵化需要从多个方面入手:保持批判性思维、接受不确定性、培养反思和创造性思维
    防止思维僵化,保持思维的灵活性和开放性,是个人成长和应对复杂问题的关键。思维僵化通常表现为固守某种思维模式或观点,难以适应变化或接受新思想。以下是一些防止思维僵化的有效方法:1. 培养批判性思维定义:批判性思维是指在面对问题或信息时,能够通过逻辑推理、分析、评估其可靠性......
  • CTF学习(19)MISC(面具下的flag)
    1.解压后发现为.jpg格式的文件--->使用010editor打开后搜索flag发现存在两个疑似flag文件的标识第一处:第二处:2.在kali使用binwalk发现藏有两个文件--->爆破zip文件(无果,可能是伪加密?)分离后的文件:3.检查文件头加密部分(偶数,无加密)--->检查文件尾加密部分'09'(奇......