根据上面的模型,我们可以深入研究一些关于消息系统设计的主题:
- 消费者并发性
- 消费者热点问题
- 消费者负载均衡
- 消息路由
- 连接多路复用
- 金丝雀部署(Canary Deployments)
生产者(Producer)
生产者向brokers发送由业务应用程序系统生成的消息。RocketMQ提供了发送:同步、异步和单向(one-way)的多种范例。
生产者组(Producer Group)
相同角色的生产者被分组在一起。同一生产者组的另一个生产者实例可能被broker联系,以提交或回滚事务,以防原始生产者在交易后崩溃。
警告:考虑提供的生产者在发送消息时足够强大,每个生产者组只允许一个实例,以避免对生产者实例进行不必要的初始化。
消费者(Consumer)
消费者从brokers那里拉取信息并将其输入应用程序。在用户应用的角度,提供了两种类型的消费者:
-
Pull型消费者(PullConsumer)
Pull型消费者主动地从brokers那里拉取信息。只要批量拉取到消息,用户应用程序就会启动消费过程
-
Push型消费者(PushConsumer)
另一方面,Push型消费者封装消息的拉取、消费进度和维护内部的其他工作,将一个在消息到达时执行的回调接口留给终端用户来实现。
消费者组(Consumer Group)
与前面提到的生产者组相似,相同角色的消费者被分组在一起并命名为消费者组。
消费者群体是一个伟大的概念,它实现了负载平衡和容错的目标,在信息消费方面,是非常容易的。
警告:消费者群体的消费者实例必须订阅完全相同的主题。
主题(Topic)
主题是生产者传递消息和消费者拉取消息的一个类别。主题与生产者和消费者之间的关系非常松散。具体来说,一个主题可能有零个,一个或多个向它发送消息的生产者;相反,生产者可以发送不同主题的消息。从消费者的角度看,一个主题可能会被零个、一个或多个消费群体订阅。类似地,消费者组可以订阅一个或多个主题,只要这个组的实例保持他们的订阅一致。
消息(Message)
消息是要被投递的信息。消息必须有一个主题,可以将其解释为您的信件地址。消息还可能有一个可选的标记(tag)和额外的键值对。例如,您可以为消息设置业务密钥,并在broker 服务器上查找消息,以便在开发期间诊断问题。
消息队列(Message Queue)
主题被划分为一个或多个子主题,称为“message queues”。
标签(Tag)
标签,换句话说,为用户提供了额外的灵活性。有了标签,来自同一个业务模块的不同目的的消息可能具有相同的主题和不同的标签。标签将有助于保持您的代码干净和连贯,并且标签还可以为RocketMQ提供的查询系统提供帮助。
代理(Broker)
代理是RocketMQ系统的主要组件。它接收来自生产者的消息,存储它们并准备处理来自消费者的拉取请求。它还存储与消息相关的元数据,包括用户组、消费进度偏移量和主题/队列信息。
名称服务(Name Server)
名称服务器作为路由信息提供者。生产者/消费者客户端查找主题以找到相应的broker 列表。
消息模型(Message Model)
- Clustering
- Broadcasting
消息顺序(Message Order)
在使用DefaultMQPushConsumer
时,您需要决定使用排序的还是并行的消息。
- 排序的(Orderly)
消费消息的有序意味着,消息的使用顺序与生产者为每个消息队列发送的顺序相同。如果您正在处理全局顺序是强制性的场景,请确保您使用的主题只有一个消息队列。
警告:如果指定消费有序,则消息消耗的最大并发性是消费者组订阅的消息队列的数量。 - 并行的(Concurrently)
并行地使用消息时,消费消息的最大并行度只受每个客户端指定的线程池大小限制。
警告:此模式不再保证消息顺序。