Rocketmq消息发送原理源码

一丶概述

RocketMQ 消息发送的原理流程可以分为以下几个步骤:

1. 创建生产者

在发送消息前,客户端首先需要创建一个消息生产者(Producer)实例,并设置必要的配置参数,如NameServer地址、生产组名称、消息发送失败的重试次数等。

2. 启动生产者

创建生产者后,需要调用启动方法来初始化生产者实例。在这个过程中,生产者会与NameServer建立连接,从NameServer获取到所有Broker的地址信息。

3. 发送消息

消息发送分为同步发送、异步发送和单向发送三种方式:

  • 同步发送(Synchronous): 生产者发送消息后,会在发送线程中等待服务器的响应,直到收到消息发送确认。
  • 异步发送(Asynchronous): 生产者发送消息后,不会等待服务器的响应,而是通过回调接口处理服务器的响应。
  • 单向发送(One-way): 生产者只负责发送消息,不等待服务器响应,也不关心消息是否到达服务器。

无论采用哪种发送方式,消息发送的主要流程如下:

  1. 消息路由: 生产者通过负载均衡算法选择一个队列,通常是根据topic和队列选择一个Broker的一个队列来发送消息。
  2. 消息发送: 生产者向选定的Broker发送消息。消息包含了topic、tags、keys、body等信息。
  3. 消息存储: Broker接收到消息后,会将消息存储到CommitLog(消息存储文件)中。如果配置了消息重试或者高可靠性相关的配置,Broker可能会执行额外的消息复制或持久化操作以确保消息的可靠性。
  4. 写入响应: Broker将消息存储确认响应返回给生产者。如果是同步发送,生产者会在这一步等待该响应;如果是异步发送,生产者会在回调函数中处理该响应。

本篇,我们就来简单看下rocketmq从生产者发送消息,学习一下其中优秀的设计!

二丶生产者消息发送

生产者消息发送本质是通过网络io将消息发送到broker中,通常通过DefaultMQProducer#send(Message)进行简单的消息发送,如下是其源码

Rocketmq消息发送原理源码_第1张图片

可看到如果设置了autoBatch并且消息本身不是一个批量消息,那么会调用sendByAccumulator(使用消息累计器进行发送,猜测会累计到内存中然后批量进行发送)

反之会调用sendDirect

你可能感兴趣的:(java-rocketmq,rocketmq,java)