文章目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 消息队列的作用
- 基本概念
消息队列的作用
- 应用解耦
AB应用不在互相依赖; 传统项目中A,B应用的消息发送是直连的,并且如果网络数据传递过程中有问题,可能导致某一方数据迟迟获取不到;并且可能存在单点故障问题,此时就需要人工或其他工具进行监控;而使用消息队列后会将消息先存储在中间件中,等合适的时机在进行消费,避免了强耦合。
- 流量削峰
流量达到高峰的时候,通常使用限流算法来控制流量涌入系统,避免系统被击瘫,但是这种方式损失了一部分请求
此时可以使用消息中间件来缓冲大量的请求,匀速消费,当消息队列中堆积消息过多时,我们可以动态上线增加消费端,来保证不丢失重要请求。
- 大数据处理
消息中间件可以把各个模块中产生的管理员操作日志、用户行为、系统状态等数据文件作为消息收集到主题中
数据使用方可以订阅自己感兴趣的数据内容互不影响,进行消费
- 异构系统
跨语言
基本概念RocketMQ中主要包括消费者,生产者,Broker,Topic;
生产者:产生数据,可以同时存在多个生产者同时发送数据;生产者生产的数据会属于一种topic(场景/主题,一种逻辑概念)
消费者:消费数据,存在消费组的概念,每一个组中可能存在多个消费者,消费者可以从多个队列中进行消费,但是每条消息只能被同一个消费者消费一次(集群消费情况下)
Broker:一般为一个物理节点,也可以理解成是一个服务;每种topic的数据可以跨越多个broker,同时每个broker也可以存储多种topic的数据;节点启动的时候会扫描NameServer,然后注册自己的信息然后定时上报。
Queue:实际存储数据的区域,每种topic中会存在多个queue,并且可以不均匀的分布在不同的broker中
NameServer: 可以类比Zookeeper,起到分布式协调的作用,充当路由的作用,会记录broker的元数据,并为producer/consumer暴露服务,告诉数据属于哪个broker-》queue当中。可以存在多个NameServer做集群。
RocketMQ的消息模型:
topic可以理解成一个大主题,还可以对其中的数据继续划分为不同的tag,可以将整个数据集粒度更细化,方便做索引提高查询效率。
RoketMQ中的两种获取数据方式:
- pull(拉取): 应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。
- push(推送):该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高。但是对于producer/consumer能力不同的时候,生产/消费能力可能不成正比,导致数据的丢失。
Consumer的消费方式:
- 集群消费:集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊消息。当queue:consumer的时候1:1平摊;如果1:N 轮询。
- 广播消费:每次消息的发送,相同Consumer Group的每个Consumer实例都接收全量的消息。
消息的消费顺序:
- 顺序消费:也可以理解是局部有序,消费者通过同一个消息队列( Topic 分区,称作 Message Queue) 收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。
当consumer拉取数据的时候,可能先获取a组或b组,宏观看可能产生 a1 b1 a2 a3 b2…,但是从不同的主题消息看,是局部有序的
- 严格顺序:不存在参杂的情况。可以得到:必须只有一个生产者,一个broker;因为一旦存在多个生产者,总会存在网络上的问题导致进入broker的顺序可能发生改变;而如果在生产数据的时候引入分布式事务,锁等其他技术也会导致整体的性能下降,所以需要更具不同的情况考虑。
所有消息按照严格的先入先出(FIFO)的顺序进行发布和消费。 适用场景:性能要求不高,所有的消息严格按照 FIFO 原则进行消息发布和消费的场景
RocketMQ的可靠性: (来自官方文档)
RocketMQ支持消息的高可靠,影响消息可靠性的几种情况:
- Broker非正常关闭
- Broker异常Crash
- OS Crash
- 机器掉电,但是能立即恢复供电情况
- 机器无法开机(可能是cpu、主板、内存等关键设备损坏)
- 磁盘设备损坏
1)、2)、3)、4) 四种情况都属于硬件资源可立即恢复情况,RocketMQ在这四种情况下能保证消息不丢,或者丢失少量数据(依赖刷盘方式是同步还是异步)。
5)、6)属于单点故障,且无法恢复,一旦发生,在此单点上的消息全部丢失。RocketMQ在这两种情况下,通过异步复制,可保证99%的消息不丢,但是仍然会有极少量的消息可能丢失。通过同步双写技术可以完全避免单点,同步双写势必会影响性能,适合对消息可靠性要求极高的场合,例如与Money相关的应用。注:RocketMQ从3.0版本开始支持同步双写。
Rocket中的broker具有集群-主从模式,对于每个主节点的broker,会将自己的消息同步到备机中;每个生产者只能向主机中写入数据,而消费者可以从主/备获取数据。



