RocketMQ基础-核心架构剖析

RocketMQ基础-核心架构剖析

RocketMQ的核心架构

RocketMQ基础-核心架构剖析_第1张图片

RocketMQ主要分为四个部分:

  1. Producer:负责生产消息;消息发布的角色,支持分布式集群方式部署,Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。
  2. Consumer:负责消费消息;消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式广播方式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求。
  3. NameServer:NameServer是一个非常简单的Topic路由注册中心,支持Broker的动态注册和发现,支持分布式集群方式部署。
  4. BrokerServer:Broker主要负责消息的存储、投递和查询以及服务高可用保证,支持分布式集群+主从架构部署。

核心模块剖析

NameServer

​ 路由注册中心,充当路由消息的提供者,支持Broker的动态注册与发现。NameServer是整个RocketMQ架构中非常关键的一个角色,如果只是单机部署的话,一单NameServer出现故障将会导致整个RocketMQ服务出现问题,所以NameServer通常都是需要集群部署,达到高可用的效果。

主要包括两个功能:

  1. Broker管理:接收保存Broker集群的注册信息作为路由信息的基本数据,并且提供心跳检测机制,检测已注册的Broker服务是否存活。
  2. 路由信息管理:每个NameServer节点都保存了关于Broker集群的整个路由信息以及用于客户端查询的队列信息,Producer和Consumer就可以通过NameServer集群获取整个Broker集群的路由信息,进行消息投递及消费。

值得注意的点:NameServer通常都是集群部署,但是每个NameServer节点都是完全独立的,节点之间没有信息交换每个Broker都会向每台NameServer注册路由信息,所以每个NameServer上都会有完整的Broker路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息。

Broker Server

​ 消息中转角色,负责存储消息、转发消息。是最重要最复杂的一个模块。在RocketMQ系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。

Broker包含了以下几个重要的子模块。

  1. Remoting Module:整个Broker的实体,负责处理来自clients端的请求。
  2. Client Manager:负责管理客户端(Producer/Consumer)和维护Consumer的Topic订阅信息
  3. Store Service:提供方便简单的API接口处理消息存储到物理硬盘和查询功能。
  4. HA Service:高可用服务,提供Master Broker 和 Slave Broker之间的数据同步功能。
  5. Index Service:根据特定的Message key对投递到Broker的消息进行索引服务,以提供消息的快速查询。

在理解Broker之前需要了解一些RocketMQ的基本概念。

  1. Message

    消息,消息系统所传输信息的物理载体,是生产和消费数据的最小单位,每条消息必须属于一个Topic。RocketMQ中每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。系统提供了通过Message ID和Key查询消息的功能。

  2. Topic

    表示一类消息的集合,每个主题包含若干条消息,每条Message只能属于一个Topic,是RocketMQ进行消息订阅的基本单位。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker

  3. Tag

    为消息设置的标志,用于同一Topic下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一Topic下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统。消费者可以根据Tag实现对不同子主题的不同消费逻辑,实现更好的扩展性。

  4. Message Queue

    消息队列,用于存储消息的物理地址每个Topic中的消息地址存储于多个 Message Queue 中

Broker通过集群化部署来抗下高并发访问。

Broker接收到消息后,都是存储到磁盘文件中的,通过分布式部署,将消息分撒到多台机器上存储,实现海量消息存储。

Broker通过主从架构+多副本策略,实现高可用保障,Master Broker收到消息后会将消息同步给Slave Broker,这样副本中就有一份一模一样的数据。每个Broker都得向NameServer注册,所以Master Broker和Slave broker都会向NameServer注册。Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。 注意:当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。

Producer

​ 生产者,Producer与NameServer集群中的其中一个节点(随机选择)建立长连接定期从NameServer获取Topic路由信息,并向提供Topic 服务的MasterBroker建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。

涉及到的基本概念:

  1. Producer Group

    同一类Producer的集合,这类Producer发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。

Consumer

​ 消费者,Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer获取Topic路由信息,并向提供Topic服务的MasterBroker、SlaveBroker建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,消费者在向Master拉取消息时,Master服务器会根据拉取偏移量与最大偏移量的距离(判断是否读老消息,产生读I/O),以及从服务器是否可读等因素建议下一次是从Master还是Slave拉取。

涉及到的基本概念:

  1. Pull Consumer

    Consumer消费的一种类型,应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。

  2. Push Consumer

    Consumer消费的一种类型,该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高。

  3. Consumer Group

    同一类Consumer的集合,这类Consumer通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)

    给订阅同一个Topic的不同业务系统设置不同的Consumer Group,可以实现一个消息被多个业务系统所消费到

    ​ 比如:真实业务场景中,在用户下单付款后,仓储系统要安排发货,积分系统要增加积分,销售系统要给用户分配销售,这种业务场景中,仓储系统、积分系统、销售系统只需要订阅同一个Topic(order_topic),只是Consumer Group不同,订单系统在用户付款后推送付款信息到这个Topic中即可,仓储、积分、销售会同时消费到这个消息,完成自身的业务即可。

RocketMQ基础-核心架构剖析_第2张图片

  1. Clustering/Broadcasting

    Clustering:集群消费模式下,相同Consumer Group的每个Consumer实例平均分摊消息。

    Broadcasting:广播消费模式下,相同Consumer Group的每个Consumer实例都接收全量的消息。

    **值得注意的一个点在于,同一个消息,集群模式下,只会被同一个Consumer Group中的一个Consumer消费,而广播模式会被所有的Consumer都消费一次。**比如:10台服务器搭建的一个消费者集群,消息模式设置为 Clustering时,收到一个消息,这个消息只会被10台服务器中的一台实例消费到,而如果是Broadcasting模式,10台服务器实例都会接收到这个消息。常用的基本上都是集群模式。

总结

经过了对RocketMQ架构的剖析后,此时,RocketMQ的架构图应该更近详细:

RocketMQ基础-核心架构剖析_第3张图片

结合上面的详细架构图,描述集群工作流程:

  1. 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。

  2. Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。

  3. 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。

  4. Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。

  5. Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。

你可能感兴趣的:(java,消息队列)