Rocketmq消息队列 消息模型 详解
消息队列模型
两种消息模型
队列模型
队列模型是最开始的一种消息队列模型,对应着消息队列“发-存-收”的模型。生产者往某个队列里面发送消息,一个队列可以存储多个生产者的消息,一个队列也可以有多个消费者,但是消费者之间是竞争关系,也就是说每条消息只能被一个消费者消费。
发布/订阅模型
在发布-订阅模型中,消息的发送方称为发布者(Publisher),消息的接收方称为订阅者(Subscriber),服务端存放消息的容器称为主题(Topic)。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。“订阅”在这里既是一个动作,同时还可以认为是主题在消费时的一个逻辑副本,每份订阅中,订阅者都可以接收到主题的所有消息。
RocketMQ 的消息模型
RocketMQ 使用的消息模型是标准的发布-订阅模型。
RocketMQ 本身的消息是由下面几部分组成:
NameServer:
生产者,消费者,Broker都会在NameServer进行注册,并向NameServer发送心跳包,NameServer可搭建集群,但是节点之间不进行互相通讯,每个Broker与NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer。
Broker:
消息存储与转发服务器,负责实际的消息读写、持久化、高可用同步。
接收消息,消息持久化,提供消息
Producer:
生产者,生产消息,向NameServer询问Broker地址,然后往Broker发送消息。Producer 与 NameServer 集群中的其中一个节点(如果这个节点挂了,就向其它节点建立连接,配置文件可以指定多个NameServer信息)建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向 Master 发送心跳。Producer 完全无状态。
Consumer:
Consumer 与 NameServer 集群中的其中一个节点建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Master、Slave 建立长连接,且定时向 Master、Slave发送心跳。Consumer 既可以从 Master 订阅消息,也可以从Slave订阅消息。
Message:
消息本身
Topic:
消息主题,用于隔离数据,需要集群内唯一,Topic是逻辑概念,物理上对应多个Queue
Queue:
消息队列,属于某个topic,例如某个topic有三条queue,生产者投递消息时会负载均衡(默认轮询)给这三个queue,也就是说queue是topic实际存储消息的地方,queue支持动态扩展,queue是为了加快topic的消费速度
Tag:
消息的某个属性,对Topic的进一步细分,例如订单topic可以分成创建订单tag、取消订单tag、支付订单tag
Offset:
Offset分为消息点位和消费点位
- 消息点位就是消息在queue中的偏移量,每个队列有自己的最小消息点位和最大消息点位,内存不够时就回滚最小的消息。
- 消费点位消费者首次订阅时可以指定从哪个offset开始消费。
- 集群模式下同一消费者组的消费者的offset应该是一样的offset,由broker以消费者组级别为粒度进行管理,消费者也可以在消费完消息后手动提交offse
- 广播模式下每个消费者本地自己维护offset
生产消息类型:
同步发送:需要等待MQ的响应结果
异步发送:设置成功和失败的回调函数即可
单向发送:直接发送,不管是否成功
消费消息类型:
集群消费:每条消息只会被订阅了这个topic的每个消费者组中的某一个消费者消费,如有消费者组A和组B和组C,则从组A、组B、组C中分别挑一个消费者出来消费。如果消费失败,不保证每一次重投到同一台机器上
广播消费:每条消息会被订阅了这个topic的每个消费者组中的所有消费者消费,如有消费者组A和组B和组C,则组A、组B、组C中所有的消费者都要消费这条消息