RocketMQ技术内幕学习笔记(三)

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个队列,那么返回的消息队列为:

  1. name: broker-a, queueId: 0
  2. name: broker-a, queueId: 1
  3. name: broker-a, queueId: 2
  4. name: broker-a, queueId: 3
  5. name: broker-b, queueId: 0
  6. name: broker-b, queueId: 1
  7. name: broker-b, queueId: 2
  8. 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支持将同一主题下的多条消息一次性发送到消息服务端。

你可能感兴趣的:(rocketmq)