RocketMQ:一次完整的通信流程是怎样的?

Producer 与 NameServer集群中的其中一个节点(随机选择)建立长连接,定期从 NameServer 获取 Topic 路由信息,并向提供 Topic 服务的 Broker Master 建立长连接,且定时向 Broker 发送心跳。

Producer 只能将消息发送到 Broker master;

Consumer 则不一样,它同时和提供 Topic 服务的 Master 和 Slave建立长连接既可以从 Broker Master 订阅消息,也可以从 Broker Slave 订阅消息。

下面的讲解流程,都是围绕下图,具体如下:

RocketMQ:一次完整的通信流程是怎样的?_第1张图片

一、NameService启动流程

在org.apache.rocketmq.namesrv目录下的NamesrvStartup这个启动类基本上描述了他的启动过程我们可以看一下代码:

  • 第一步是初始化配置

  • 创建NamesrvController实例,并开启两个定时任务:

  • 每隔10s扫描一次Broker,移除处于不激活的Broker

  • 每隔10s打印一次KV配置。

类:NamesrvController

this.scheduledExecutorService.scheduleAtFixedRate(NamesrvController.this.routeInfoManager::scanNotActiveBroker, 
5, 10, TimeUnit.SECONDS);

this.scheduledExecutorService.scheduleAtFixedRate(NamesrvController.this.kvConfigManager::printAllPeriodically, 
1, 10, TimeUnit.MINUTES);
  • 第三步注册钩子函数,启动服务器并监听Broker。

NameService是很有意思的,比如路由注册会发送心跳包,还有心跳包的处理流程路由删除路由发现等等。

二、Broker 

Broker 在RocketMQ中是进行处理Producer发送消息请求,Consumer消费消息的请求,并且进行消息的持久化,以及HA策略和服务端过滤,就是集群中很重的工作都是交给了Broker进行处理。

Broker 模块是通过BrokerStartup进行启动的,会实例化BrokerController,并且调用其初始化方法。

类:BrokerStartup

public static BrokerController start(BrokerController controller) {
	try {
		controller.start();

		String tip = "The broker[" + controller.getBrokerConfig().getBrokerName() + ", "
			+ controller.getBrokerAddr() + "] boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer();

		if (null != controller.getBrokerConfig().getNamesrvAddr()) {
			tip += " and name server is " + controller.getBrokerConfig().getNamesrvAddr();
		}

		log.info(tip);
		System.out.printf("%s%n", tip);
		return controller;
	} catch (Throwable e) {
		e.printStackTrace();
		System.exit(-1);
	}

	return null;
}

Broker的源码的话会发现,他的初始化流程很冗长会根据配置创建很多线程池,主要用来发送消息拉取消息查询消息客户端管理消费者管理也有很多定时任务,同时也注册了很多请求处理器,用来发送拉取消息查询消息的。

三、Producer 

链路很长涉及的细节也多,我就发一下链路图。

RocketMQ:一次完整的通信流程是怎样的?_第2张图片

 Producer是消息发送方,那他怎么发送的呢?

通过轮训,Producer轮训某个Topic下面的所有队列实现发送方的负载均衡。

RocketMQ:一次完整的通信流程是怎样的?_第3张图片

四、Consumer

RocketMQ:一次完整的通信流程是怎样的?_第4张图片

Consumer是消息接受,那他怎么接收消息的呢? 

RocketMQ:一次完整的通信流程是怎样的?_第5张图片

 消费端会通过RebalanceService线程,10秒钟做一次基于Topic下的所有队列负载。

你可能感兴趣的:(MQ,分布式,中间件,java,rocketmq)