RocketMQ有namesrv、broker、producer、consumer,每种角色都可以以集群的方式存在。
namesrv
namesrv 是一个无状态的节点,底层由netty实现,提供服务注册、服务发现、路由管理的功能。
-
namesrv作为服务发现者,集群中的其他角色都需要定时向namesrv上报自己的状态,以便互相发现彼此,若超时不上报的话,namesrv会把他们从列表中剔除。 -
namesrv是无状态的,可以集群化部署多个,集群间每个节点互不通信,没有主备的概念;当有多个namesrv存在时,其他角色需要同时向每个namesrv上报信息,保证高可用。 -
namesrv是内存式存储,namesrv中的broker、Topic等信息默认不会被持久化。
Q&A
Q:为什么不使用zookeeper,而要自己实现一个namesrv呢?
A:rocketmq追求集群环境下的性能,而zookeeper需要保证最终一致性,性能上会有一些折扣。
broker
broker 是负责接收消息、存储消息、转发消息的关键角色。
-
broker多机负载,可以部署多个
- 每一个broker在启动时都会遍历namesrv列表,与每一个namesrv建立长链接,注册自己的信息,之后定时向namesrv上报。
-
broker 是高可用的,可以配置Master/Slave结构,Master可读可写,Slave只读,Master将写入的数据同步到Slave。
- 一个Master可以对应多个Slave。
- Master和Slave的对应关系,通过配置相同的BrokerName,不同的BrokerId来指定,BrokerId为0表示Master,非0表示Slave。
producer
producer 是消息的生产者。
producer 通过与namesrv集群中的其中一个节点(随机选择)建立长连接,获取Topic的路由信息,包括Topic下有哪些Quene,分布在哪些broker上等。
然后会与提供Topic服务的Master节点建立长连接发送消息,并且定时发送心跳。
consumer
consumer 是消息的消费者。
consumer 通过namesrv集群获取Topic的路由信息,连接到对应的broker上消费消息。
由于Master和Slave都可以读取消息,因此consumer会与Master和Slave都建立连接。