3.1:RocketMQ消息发送
- 同步:同步等待,直到消息服务器返回发送结果
- 异步:发送时指定消息发送成功后的回调函数,然后调用发送API后立即返回,消息发送者线程不阻塞,直到运行结束,消息发送成功或失败的回调任务在一个新的线程中执行
- 单向:发送后直接返回,不等待消息服务器返回结果,也不注册回调函数。简单地说,就是只管发,不在乎消息是否成功存储在消息服务器上
3.2: 认识RocketMQ消息
RocketMQ消息封装类是org.apache.rocketmq.common.message.Message
3.3: 生产者启动流程
3.3.1:初识DefaultMQProducer消息发送者
3.3.2:消息生产者启动流程
DefaultMQProducerImpl#start
3.4: 消息发送基本流程
- 验证消息
- 查找路由
- 消息发送(包含异常处理机制)
3.4.1: 消息长度验证
3.4.2:查找主题路由信息
3.4.3:选择消息队列
根据路由信息选择消息队列,返回的消息队列按照broker、序号排序。举例说明,如topicA在broker-a,brcker-b上分别创建了4个队列,那么返回的消息队列为:
- name: broker-a, queueId: 0
- name: broker-a, queueId: 1
- name: broker-a, queueId: 2
- name: broker-a, queueId: 3
- name: broker-b, queueId: 0
- name: broker-b, queueId: 1
- name: broker-b, queueId: 2
- name: broker-b, queueId: 3
首先消息发送端采用重试机制,由retryTimesWhenSendFailed指定同步方式重试次数,异步重试机制在收到消息发送结构后执行回调之前进行重试。由retryTimesWhenSendFailed指定,接下来就是循环执行,选择消息队列,发送消息,发送成功则返回,收到异常则重试。
选择消息队列有两种方式:
- sendLatencyFaultEnable = false ,默认不采用Broker故障延迟机制
- sendLatencyFaultEnable = true,启动Broker故障延时机制
3.4.4: 消息发送
消费发送API核心入口:DefaultMQProducerImpl#sendKernelImpl
todo 这里补一下
3.5: 批量消息发送
3.6: 本章小结
- 消息生产者启动流程:
重点理解MQClientInstance,消息生产者之间的关系 - 消息队列负载机制
消息生产者在发送消息时,如果本地路由表中未缓存topic的路由信息,向NameServer发送获取路由信息请求,更新本地路由信息表,并且消息生产者每隔30s从NameServer更新路由表。 - 消息发送异常机制
消息发送高可用主要通过两个手段:重试与Broker规避。Broker规避就是在一次消息发送过程中发现错误,在某一时间段内,消息生产者不会选择该Broker(消息服务器)上的消息队列,提高发送消息的成功率。 - 批量消息发送
RocketMQ支持将同一主题下的多条消息一次性发送到消息服务端。