发布时间:2023-02-22 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

分布式通信:消息队列

什么是消息队列?

队列是一种具有先进先出特点的数据结构,消息队列是基于队列实现的、存储具有特定格式的消息数据。消息以特定格式放入这个队列的尾部后直接返回,不需要系统马上处理,之后有其他进程从队列头部开始读取消息,按照消息放入顺序逐一处理。

引入消息队列的好处是可以提升响应速度,实现组件之间的解耦。

消息队列的工作原理

消息队列模式包括3个核心部分:

生产者将发送的消息插入到消息队列,称为入队,消费者从消息队列中按照顺序取出消息进行处理,称为出队。

RocketMQ工作原理

RocketMQ的架构图如下所示。

《分布式技术原理与算法解析》学习笔记Day19

RocketMQ架构包括4部分:

在Broker Cluster中,消息的存储采用主题(Topic)+ 消息队列(Queue)的方式实现。

RocketMQ中的主题是一个逻辑概念,一个主题可以分区,分布在不同的Broker上,每个Broker只有该主题的部分数据。每个主题分区中,队列的数量可以不同,由用户在创建主题时指定。队列是资源分配的基本单元,消息进行存储时会存放到相应主题的分区中。

RocketMQ的工作流程如下:

  1. 首先启动NameServer,然后启动Broker。Broker启动后,会主动找NameServer建立连接,并将自己的信息注册到NameServer上。注册完毕后,Broker会定期给NameServer发送心跳包,心跳包中除了状态信息外,还可以包括Broker当前存储的数据信息。
  2. 创建主题,并确定这个主题的数据存储到哪些Broker上。
  3. 当Producer生产消息发送到主题时,需要先到NameServer查询该主题存放在哪些Broker中,获取到Broker信息后,将消息发送给这些Broker进行存储。
  4. Consumer要从主题消费消息,也需要首先到NameServer查询一下该主题的消息存储在哪些Broker上,然后去相应的Broker获取消息进行消费。

消息队列模式是根据消费者需求到消息队列获取数据进行消费的,消费者只需要知道消息队列地址,消息队列中心无需提前知道消费者信息。因此,消息队列模式比较适合消费者为临时用户的场景。

发布订阅模式和消息队列模式的区别

首先,从实现解耦的数据结构看:

其次,从实现解耦方式来看:

消息队列中的消息,可以被设置只消费一次、至少消费一次或者最多消费一次。