0x02 RocketMQ中的角色

251 阅读2分钟

RocketMQ有namesrv、broker、producer、consumer,每种角色都可以以集群的方式存在。

image.png

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都建立连接。