为了规定消息队列中生产者和消费者的行为,消息中间件的构建中会实现不同的消费模型。
本文将讨论来自于 RocketMQ 中具体的两种消费模式
是消息队列中两种典型消费模型的实现
接下来就看一下 消息队列都有哪些消费模型,以及对应的具体实现
消息队列的消费模型
消息队列的两种基础模型,即点对点和发布订阅方式
这两种模型来源于消息队列的 JMS 实现标准
消息队列有不同的实现标准,比如 AMQP 和 JMS
JMS(Java Message Serice)是 Java 语言平台的一个消息队列规范,ActiveMQ 是其典型实现。
AMQP 也定义了几种不同的消模型,包括 direct exchange,topic change,headers exchange,system exchange 等,其中 direct exchange 可以类比点对点,其他的模型可以类比发布订阅。

点对点模型
生产者向一个特定的队列发布消息,消费者从该队列中读取消息,每条消息只会被一个消费者处理

发布订阅模型

点对点模型和发布订阅模型,主要的区别就是消息能否被多次消费。
发布订阅模型实现的是广播机制,如果只有一个消费者,则可以认为是点对点模型的一个特例。
kafka 的消费模式

ZooKeeper 在 Kafka 中主要用于维护 Offset 偏移量,以及集群下的 Leader 选举。
Kafka 的消费是基于 Topic 的,属于发布订阅机制
它会持久化消息,消息消费完后不会立即删除,会保留历史消息
可以比较好地支持多消费者订阅
RocketMQ 的消费模式

具体的消费模式中, RocketMQ 和 Kafka 类似,除了 Producer 和 Consumer
主要分为 Message,Topic,Queue及 ConsumerGroup 这几部分
同时,RocketMQ 额外支持 Tag 类型的划分
Topic
Topic 表示消息的第一级归属,每条消息都要有一个 Topic,一个Group 可以订阅多个主题的消息,对于电商业务,根据业务不同,可以分为商品创建消息,订单消息,物流消息。
Tag
Tag 表示二级消息分类,比如在电商业务中,一个订单消息可以分为订单完成消息,订单创建消息等,Tag 的添加,使得 RocketMQ 中对消息的订阅更加方便
ConsumerGroup
ConsumerGroup 一个消费组可以订阅多个 Topic ,这个是对订阅模式的扩展。
Kafka 是由 Scala 实现,RabbitMQ 是由 Erlang 实现,RocketMQ 是由 Java 实现
RocketMQ 的消费模式分为 集群消费和广播消费两种,默认是集群消费
集群消费和广播消费的区别
-
集群消费:集群消费实现了点对点模型的扩展,任意一个消息只要被集群里任意一个消费者处理即可。
20230710200225.jpg
-
广播消费:广播消费的实现是发布订阅模式,发送到消费组中的消息,会被多个消费者分别处理一次。
在集群消费中,为了将消息分发给消费组中的多个实例,需要实现消息的路由,也就是负载均衡
在 RocketMQ 中,支持多种负载均衡的策略,主要包括以下几种:
- 平均分配策略,默认的策略
- 环形分配测试
- 手动配置分配策略
- 机房分配策略
总结
本文分析了消息队列的两种消息模型
以及不同消息模型的 Kafka 和 RocketMQ 等消息队列中的具体实现
不同的消息模型会影响队列的设计
进而影响队列的消息一致性,时序性,以及传输可靠性上的实现方式
在分布式系统中,为了保证高可用,引入了各种集群和副本技术
Kafka 和 RocketMQ 实现的都是以发布订阅模式
在消息队列 RabbitMQ 中,实现的就是点对点的消息传输模式
网友评论