RocketMQ设计原理分析

RocketMQ3.x及以前版本由阿里维护,RocketMQ4.x及以后版本是捐赠给Apache社区,孵化成为Apache顶级项目的版本号,这一点从RocketMQ客户端的包名由com.alibaba改为org.apache可以得到证实。本文主要从设计原理上对RocketMQ进行分析。

一、RocketMQ发送消息三种方式:同步发送、异步发送、单向(Oneway)发送

1、同步发送

同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式。此种方式应用场景非常广泛,例如重要通知邮件、短信系统等。

2、异步发送

异步发送是指发送方发出数据后,不等接收方发回响应,接着可以发送下个数据包的通讯方式。消息发送方在发送了一条消息后,不需要等待Broker响应即可进行接下来的业务处理。发送方通过回调接口SendCallback接收Broker响应,并对响应结果进行处理。异步发送一般用于链路耗时较长,对 RT 响应时间较为敏感的业务场景。

3、单向(Oneway)发送

单向发送特点为发送方只负责发送消息,不需要Broker应答。适用于对可靠性要求并不高的场景,例如日志收集。

二、RocketMQ两种消费模式:集群消费、广播消费

1、集群消费

多个consumer平均消费该topic下所有mq的消息,即某个消息在某个message queue中被一个consumer消费后,其他消费者就不会消费到它。

2、广播消费

所有consumer可以消费到发到这个topic下的所有消息。

三、RocketMQ常见部署结构

1、Name Server

名称服务Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。

2、Broker

Broker是RocketMQ的核心,大部分“重量级”的工作都是由Broker完成的,集群模式下Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的Broker Name,不同的Broker Id来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。

每个Broker与Name Server集群中的所有节点建立长连接,定时(每隔30s)注册Topic信息到所有Name Server。Name Server定期(每隔10s)扫描所有存活broker的连接,如果Name Server超过2分钟没有收到心跳,则Name Server断开与Broker的连接。

3、Producer

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

Producer每隔30s从Name server获取所有topic队列的最新情况,这意味着如果Broker不可用,Producer最长30s时间能够感知,在此期间内发往Broker的所有消息都会失败。

Producer每隔30s向所有关联的broker发送心跳,Broker每隔10s中扫描所有存活的连接,如果Broker在2分钟内没有收到心跳数据,则关闭与Producer的连接。

4、Consumer

Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,并且定期向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。

Consumer每隔30s从Name server获取topic的最新队列情况,这意味着Broker不可用时,Consumer最多最需要30s才能感知。

Consumer每隔30s向所有关联的Broker发送心跳,Broker每隔10s扫描所有存活的连接,若某个连接2分钟内没有发送心跳数据,则关闭连接;并向该Consumer Group的所有Consumer发出通知,Group内的Consumer重新分配队列,然后继续消费。

当Consumer得到master宕机通知后,转向slave消费,slave不能保证master的消息100%都同步过来了,因此会有少量的消息丢失。但是一旦master恢复,未同步过去的消息会被最终消费掉。

猜你喜欢

转载自blog.csdn.net/wangpf2011/article/details/90384053