RocketMQ 的消息模型

消息队列有两种消息模型分别是队列模型和发布/订阅模型。

队列模型

队列模型是最开始的一种消息队列模型,对应着消息队列“发-存-收”的模型。生产者往某个队列里面发送消息,一个队列可以存储多个生产者的消息,一个队列也可以有多个消费者,但是消费者之间是竞争关系,也就是说每条消息只能被一个消费者消费。

发布/订阅模型

如果需要将一份消息数据分发给多个消费者,并且每个消费者都要求收到全量的消息。很显然,队列模型无法满足这个需求。于是,发布/订阅模型就诞生了。

在发布-订阅模型中,消息的发送方称为发布者(Publisher),消息的接收方称为订阅者(Subscriber),服务端存放消息的容器称为主题(Topic)。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。“订阅”在这里既是一个动作,同时还可以认为是主题在消费时的一个逻辑副本,每份订阅中,订阅者都可以接收到主题的所有消息。

“订阅/发布模型”和“队列模型” 的相同点在于:生产者就是发布者,队列就是主题,消费者就是订阅者,无本质区别;唯一的不同点在于:“订阅/发布模型”中一份消息数据可以可以被多次消费,“队列模型”的一个消息只能被消费一次。

RocketMQ 的消息模型

RocketMQ 使用的消息模型是标准的发布-订阅模型,在 RocketMQ 的术语表中,生产者、消费者和主题,与发布-订阅模型中的概念是完全一样的。

RocketMQ 本身的消息是由下面几部分组成:

Message:要传输的消息。一条消息必须有一个主题(Topic),主题可以看做是你的信件要邮寄的地址。一条消息也可以拥有一个可选的标签(Tag)和额外的键值对,它们可以用于设置一个业务 Key 并在 Broker 上查找此消息以便在开发期间查找问题。

Topic:可以看做消息的分类,它是消息的第一级类型。比如一个电商系统可以分为:交易消息、物流消息等,那么这个消息的 Topic 就是“交易”、“物流”。Topic 与生产者和消费者的关系非常松散,一个 Topic 可以有0个、1个、多个生产者向其发送消息,一个生产者也可以同时向不同的 Topic 发送消息(一个生产者可以向不同的 Topic 发送消息,一个 Topic 消息也可以由多个生产者发送)。一个 Topic 也可以被 0个、1个、多个消费者订阅。

Tag:可以看作子主题,它是消息的第二级类型,用于为用户提供额外的灵活性。同一业务模块、不同目的的消息就可以用相同的 Topic 和不同的 Tag 来标识。比如交易消息又可以分为:交易创建消息、交易完成消息等,即一级类型为“交易”,二级类型为“完成”或“创建”等。Tag 并不是消息的必须属性,一条消息可以没有 Tag。

Tag 标签有助于保持代码的干净和连贯,而且还可以为 RocketMQ 提供的查询系统提供帮助。

Group:RocketMQ 中,订阅者的概念是通过消费者组(Consumer Group)来体现的。每个消费者组都消费 Topic 中一份完整的消息,不同消费者组之间消费进度彼此不受影响,也就是说,一条消息被 Consumer Group1 消费过,也会再给 Consumer Group2 消费。

消费者组中包含多个消费者,同一个组内的消费者是竞争消费的关系,每个消费者负责消费组内的一部分消息。默认情况,如果一条消息被消费者 Consumer1 消费了,那同组的其他消费者就不会再消费这条消息。

Message Queue(消息队列):一个 Topic 下可以设置多个消息队列,即 Topic 包括多个 Message Queue 。同时生产者可以向这多个消息队列中发送消息。如果一个 Consumer 需要获取 Topic下所有的消息,就要遍历所有的 Message Queue。

RocketMQ 还有一些其它的 Queue——例如 Consumer Queue。

Offset:偏移量在 Topic 的消费过程中,由于消息需要被不同的消费者组进行多次消费,所以消费完的消息并不会被立即删除,这就需要 RocketMQ 为每个消费者组在每个队列上维护一个消费位置(Consumer Offset),这个位置之前的消息都被被标识为消费过,之后的消息都没有被消费过,每成功消费一条消息,消费位置就加一。也可以这么说,Queue 是一个长度无限的数组,Offset 就是 Queue 的下标。

除了消息模型之外,还有一个概念叫做消费模式。目前消息队列主要有两种消费模式:Clustering(集群消费)和 Broadcasting(广播消费)。

默认情况下就是集群消费,这种模式下一个消费者组共同消费一个主题的多个队列,一个队列只会被一个消费者消费,如果某个消费者挂掉,分组内其它消费者会接替挂掉的消费者继续消费。消费者组中的每个消费者实例会平均分摊消息。

而广播消费消息则会将消息发给消费者组中的每一个消费者进行消费。消费者组中的每个消费者实例都会全量消费每条消息。

本文参考自:两万字、三十图、二十三问,搞定RocketMQ! - 掘金

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值