首先来一张网上的rocketMq架构图,让大家直观感受下:

rocketMq架构概述

下面我们就这张架构图上的几个主要角色进行介绍:

          namesrv集群:负责接受broker注册的路由信息,并为producer和consumer提供路由查询服务

               1).路由信息包括了broker自身的一些信息,如IP地址,brokerId,brokerName,broker所属集群等,还包括该broker中管理的每个topic对应的多个queue信息,queue是一个虚拟的概念,可以简单理解为在该broker上为这个topic维护了几个队列,可读队列数量与可写队列数量分别是多少,queue的作用有两个:方便横向扩展以及消息生产时各个broker的权重分配,下文会有说明

               2).有了路由信息,生产者就可以知道消息该往哪些broker上发,消费者就可以知道从哪些broker的哪些queue上可以拉到消息了

               3).namesrv集群由一个或者多个namesrv机器组成,机器之间相互独立,不产生任何通信

              注意:在使用rocketMq时,必须首先启动namesrv

broker集群:负责topic的创建,向namesrv注册路由信息,消息存储,消息查询,消息消费

         1).broker集群由一台或者多台master broker和slave borker组成,master broker之间无通信,多个master broker用于分摊消息生产时的压力,每个topic对应的消息会被分配到一个broker集群下的所有master broker上,生产者在发送指定topic的消息时,会从所有可写queue中轮询一个queue进行消息发送,这里的queue对应于broker向namesrv注册的路由信息中的写队列数,不同能力的master broker机器可以配置不同数量的可写队列数,可以实现消息的权重分配。另外,由于topic上的消息可以被分配到任意个broker上,这就支持了方便的broker横向扩展

        2).slave broker用于对master broker进行消息同步备份

        注意:在使用rocketMq时,broker应该在namesrv启动后进行启动(在调试源码时,也是这个启动顺序)

producer与consumer:生产者与消费者,其实都属于rocketMq的客户端,一个应用程序中往往都是生产者与消费者都有的

         1).在namesrv以及broker都启动后,生产者就可以进行启动以及消息发送了,消费者也可以进行启动以及消息订阅了。注意,生产者与消费者也需要一个启动过程才能正常工作,无论是namesrv、broker、生产者或者消费者,都需要在启动时完成一定的准备工作,为后续的工作做准备

topic:一类消息的标识

        1).在消息生产与订阅时,都需要指定topic,表示生产哪种消息,以及对哪种消息感兴趣,我们可以通过rocketMq的控制台进行topic的维护

tag:topic下的小类,用于更细粒度的消息过滤

        1).如果将topic看做消息的种类,那么tag就是topic下更细粒度的分类,在消息生产与订阅时,除了要指定topic外,tag也同样需要指定

        2).关于topic和tag的用法,官网有最佳实践,读者可以参考https://help.aliyun.com/document_detail/95837.html?spm=a2c4g.11174283.6.659.69a0449c3DwW4U

组:包括生产者组合消费者组,我们主要关注消费者组

        1).消费者组指一类Consumer,消费者初始化时需要指定所属的消费者组(groupId),注意:这类Consumer 要求消费同一类(topic和tag一样)消息,且消息订阅的逻辑一致。可以这样理解:你的项目中有一个消费者,指定的组为group_s,然后你的项目被集群部署在多台机器上,那么这些不同机器上的相同消费者,就属于一个消费者组group_s。

       2).rocketMq中消费者组是一个很重要的概念,在集群消费模式下(集群消费下面有介绍),同一个组内的所有消费者默认会均摊topic下的消息,好处很明显,消费者的消费能力可以横向扩展。

集群消费:rocketMq中一种最常用的消费模式

       1).一条消息只能被同一个groupId下的一个Consumer消费(这个很好理解,你的项目集群部署,一条消息你肯定希望只会被消费一次)

       2).一个groupId所标识的所有 Consumer 平均分摊消费消息。例如某个 Topic 有 9 条消息,一个groupId下包含 3 个 Consumer ,那么每个consumer只会消费到其中的 3 条消息,至于该机制如何实现的,后面会有文章专门叙述

总结:本文为大家讲解了rocketMq中几个角色的分工以及名词介绍,后面会为大家详细展开rocketMq的工作原理

相关文章: