1.nameserver
可以做集群,提供轻量级的服务发现与路由。每个nameserver记录完整的路由信息,提供等效的读写服务并支持快速存储扩展。
就是一个注册中心,存储当前集群所有broker的信息、Topic和broker的对应关系。
nameserver用于存储topic、broker关系信息,功能简单、稳定性高。多个nameserver之间没有通信,单台nameserver宕机不影响其他nameserver和集群。即使所有的nameserver宕机,已建立连接的producer、consumer、broker仍然可以正常工作,但新起的producer、consumer、broker就无法正常工作。
nameserver的工作压力不会太大,平时主要的开销就是维持心跳和提供topic-broker的关系数据。有一点需要注意的是,broker向nameserver发送心跳的时候会携带自己所有的topic信息,如果过多的话,会导致一次心跳当中数据传输失败,导致心跳失败。
2.producer
消息的生产者,拥有同一个topic的producer组成一个集群。
producer和nameserver集群中的一个节点(随机选择)建立长连接,定期从nameserver获取topic路由信息。并向提供topic服务的broker的master建立长连接,然后定时向master发送心跳。
producer完全无状态,可以集群部署。
producer group用来表示一个发送消息应用,一个producer group下包含多个producer实例,可以是一台机器也可以是多个进程,或者说是一个进程的多个producer对象。一个producer group可以发送多个topic消息,一个producer group的作用如下:
- 标识一类producer
- 可以通过运维工组查询这个发送消息应用下有多少producer实例
- 发送分布式事务消息时,如果一个producer实例意外宕机,broker会主动回调同一个group中的任意一个producer来确认事务的状态。
3.consumer
消费者,简单来说消费MQ上的消息的应用程序就是消费者,至于消息是否进行逻辑处理,还是直接存储到数据库取决于业务需求,拥由相同consumer group的consumer组成一个集群。
consumer和nameserver集群中的一个节点(随机选择)建立长连接,定期从nameserver获取topic路由信息,并向提供topic的master、slave建立长连接,并定时向master、slave发送心跳。consumer既可以从master订阅信息也可以从slave订阅信息,订阅规则由broker制定。
一个consumer group下的多个consumer以均摊的方式(也就是集群模式)消费消息,如果设置为广播模式,那么这个group内的各个实例都消费全量数据。
4.broker
提供轻量级的topic机制和queue机制来处理消息存储,同时支持推(push)拉(pull)结合的模式以及主从结构的容错模式。
broker集群最核心的模块:负责topic的存储、管理、分发功能。
单个broker和所有的nameserver保持心跳连接,间隔为30秒,请求中包括当前broker的所有topic信息。nameserver会反查broker的心跳信息,如果一个broker在2分钟内都没有心跳,则认为该broker下线,调整topic和broker的对应关系。但此时nameserver不会主动通知producer和consumer有broker宕机。
broker集群部署相对复杂,分为master和slave,一个master对应多个slave,但一个slave只能对应一个master,其对应关系可以通过制定相同的brokerName和不同的brokerId来定义,id为0代表master、非0代表slave。