根据上面的模型,我们可以深挖关于消息系统设计的一些主题:
- 消费组并发性
- 消费者热点问题
- 消费者负载均衡
- 消息路由
- 连接多路复用
- 金丝雀部署
生产者
生产者将业务应用产生的消息发送到broker。生产者提供多种发送模式:同步,异步和单向。
生产者群组
相同角色的多个生产者组合在一起。如果原始生产者事物之后崩溃,broker联系同一生产者组内的不同生产者实例提交或回滚事务。
注意
考虑到提供的生产者在发送消息方面足够强大,每个生产者组只允许一个生产者实例,以避免多余的生产者实例初始化。
消费者
消费者从brokers拉去消息和将它们给应用。从用户应用角度,提供了两种消费者:
pull消费者
pull消费者主动从broker获取消息。一旦批量的消息被取回,用户应用开始消费处理。
push消费者
另一方面,push消费组封装消息拉取,消费进度和维护其他内部工作,为最终用户留下回调接口,实现在消息到达时执行。
消费者群组
类似前面提到的生产者群组,同样角色的消费者组合在一起称为消费者群组。
消费者群组是一个很好的概念,在消息消费方面,达到负载均衡和容错是很容易的。
注意
消费者群组的消费者必须拥有相同的主题订阅。
主题
主题是生产者发送消息和消费者提取消息的一种分类。主题与生产者和消费者的关系很松散。更具体的说,一个主题可能那个有0,1或多个生产者向其发送信息;相反,一个消费组可以发送不同主题的消息。从消费者来看,一个主题可能被0,1或多个消费组群组订阅。类似,一个消费者群组可能订阅一个或多个主题,只要该组的实例一直保持它们的订阅。
消息
被投递的信息称为消息。一个消息必需有一个主题,它可以被理解为信件可以邮寄到的地址。一个消息也可以有可选的标签和额外的键值对。例如,你可以给消息设置一个业务键,并在broker上查找本消息来诊断开发中的问题。
消息队列
消息队列,主题被分为一个或多个子主题。
标签
标签,也可以称为子主题,为用户提供了更多的灵活性。来自于同一业务模型的不同用途的消息可以有相同的主题和不同的标签。标签对于保持代码清晰和连贯是非常有帮助的,并且标签同样可以促进RocketMQ提供的查询系统。
代理broker
Broker是RocketMQ系统非常重要的组件。它接收来自于生产者的消息,存储消息并准本处理来自消费者的pull请求。它同样存储与消息相关的元数据,包括消费组群组,消费进度偏移量和主题/队列信息。
name server
name server作为信息信息提供者。生产者/消费组客户端通过主题来发现相应的broker列表。
消息模型
- 集群
- 广播
消息顺序
使用DefaultMQPushConsumer时,你可以决定串行或并行消费消息。
串行
串行消费消息意味着,消息消费与生产者为每个消息队列发送的消息有相同的顺序。如果强制方案是处理顺序的全局性,请确保使用的主题只有一个消息队列。
警告:
如果指定串行消费,消息消费的最大并行数 就是消费者群组订阅消费队列的数量。
并行
并行消费消息时,消息消费的最大并行数只受限于每个消费者客户端指定的线程池。
警告:
此模式不保证消息的顺序。