RocketMq的角色组成由 nameserver 、broker、producer、consumer ,当然这些角色都可以以集群的方式存在,因为RocketMQ是站在巨人的肩膀上(kafka)MetaQ的内核,又对其进行了优化让其更满足互联网公司的特点。它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。 RocketMQ目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。下面我们分别来介绍一下这些角色组成。
1、nameserver
nameserver的底层是由netty实现:提供路由管理、服务注册、服务发现的功能,是一个无状态的节点。
nameserver作为服务的发现者:集群中的各个角色(producer、broker、consumer)都要定时的向nameserver上报自己的状态,以便互相发现彼此,超时不上报会从列表中剔除。
nameserver可以集群化部署:当有多个nameserver存在时,其他角色会同时向他们上报信息,这样可以保证nameserver的高可用性,他们之间互不通信,没有主从的关系。
nameserver是内存式存储:nameserver中的broker、topic默认不会持久化。
有人会说为什么不使用zookeeper?-----------:rocketmq主要是在分布式情况下使用追求性能,因为zookeeper最求最终一致性,所以在性能上会有所折扣。
2、broker
broker面向producer(发送消息)、consumer(接受消息),broker需要向nameserver提交自己的信息,是消息中间件的消息存储器和消息转发器。每个broker在启动的时候都会遍历nameserver的列表,与每一个nameserver建立连接,注册自己的信息,之后定时向每一个nameserver上报。
当然broker也可以集群化,broker的高可用模式下存在主从的关系,Master可读可写,Slave只可读,Master会将写入的数据同步给Slave。Master多机负载,可以部署多个broker,每个broker与nameserver集群中的所有节点建立长连接,定时注册topic信息到nameserver。
3、producer
producer是消息的生产者,通过集群中的任意一个(nameserver)节点(随机选择)建立长连接,获取topic的路由信息【包括Topic下有那些queue,这些queue分布在哪些broker上等等】。接下来向提供topic服务的master(broker)建立长连接,且定时发心跳。
4、consumer
消息的消费者,通过NameServer集群获得Topic的路由信息,连接到对应的Broker上消费消息。【注意】,由于Master和Slave都可以读取消息,因此Consumer会与Master和Slave都建立连接。