一、音讯发送的几种办法

1. 同步

音讯生产者向MQ发送音讯时分,同步等候,直到服务器回来发送成果,即牢靠的同步传输。

2. 异步

音讯生产者向MQ发送音讯时分,指定音讯发送成功后的回调函数,调用音讯API发送成功后,马上回来,不阻塞音讯发送流程,音讯发送成功后或者失利后回调使命在一个新的线程中履行,即牢靠的异步传输。

3. 单向

音讯生产者向MQ发送音讯时分,调用完音讯发送API后,直接回来,不等候音讯的发送成果,即单向

二、音讯的高可用规划

2.1 音讯发送重试机制

RocketMQ在音讯发送失利的时分,默许会重试2次

2.2 故障躲避机制

当音讯第一次发送失利的时分,假如下一次音讯发送仍是路由到刚才的Broker上,其音讯发送大概率是失利的,因而为了保证重试的牢靠性,在重试的时分会尽量避开刚刚接纳失利的Broker,而是选择其他Broker上的行列进行反送,然后进步音讯的发送成功率

3.RocketMQ-消息生产

三、音讯数据结构

RocketMQ音讯封装类是org.apache.rocketmq.common.message.Message,相关属性如下:

    // 音讯所属topiic
    private String topic;
    // 音讯标记
    private int flag;
    // 扩展属性
    private Map<String, String> properties;
    // 音讯体
    private byte[] body;
    // 事物d
    private String transactionId;

四、生产者发动流程分析

生产者默许完成org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl,查看其start办法完成如下:

3.RocketMQ-消息生产
这儿注意创立的mqClientInstance实例,最终被MQClientManager管理,并且是单例的,所以同一个clientId只会创立一个MQClientInstance实例,clientId生成规则为:IP+instance+unitname,想象一下,假如同一台机器部署了两个应用程序,那么clientId岂不是相同?

为了避免这个问题,rocketMQ会自动的将instanceName设置为进程id避免互相影响。

五、音讯发送流程

音讯发送入口为org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl#sendKernel Impl,接口界说如下:


        private SendResult sendKernelImpl(final Message msg,
            final MessageQueue mq,
            final CommunicationMode communicationMode,
            final SendCallback sendCallback,
            final TopicPublishInfo topicPublishInfo,
            final long timeout)
  • Message msg:待发送的音讯
  • MessageQueue mq:音讯要发送到的行列
  • CommunicationMode communicationMode:音讯发送模式,SYNC、ASYNC、ONEWAY
  • SendCallback sendCallback:异步音讯回调函数
  • TopicPublishInfo topicPublishInfo:主题路由信息
  • final long timeout:超时时间

音讯发送整体流程如下:

3.RocketMQ-消息生产

5.1 获取Broker网格地址

3.RocketMQ-消息生产

依据MessageMQ信息获取Broker地址,假如未获取到,则从NameServer主动更新topic路由信息。

5.2 生成音讯大局仅有id

3.RocketMQ-消息生产
为音讯生成大局仅有id(雪花算法,ip+时间戳+递增序号),假如音讯默许超过4KB,则对音讯采用zip压缩,假如是事物音讯,则设置音讯类型为MessageSysFlag.TRANSACTION_PREPARED_TYPE;

5.3 音讯增强

3.RocketMQ-消息生产
假如注册了音讯发送钩子函数,则履行音讯发送之前的增强逻辑。

5.4 构建音讯发送恳求

3.RocketMQ-消息生产
音讯体首要包含:生产者组、主题名称、默许创立主题key、行列数、行列id 音讯标记、发送时间等等。

5.5 履行发送

RocketMQ支撑三种音讯发送,因而,这儿也对应三种不同的音讯发送办法。同步发送完成为MQClientAPIImpl#sendMessageAsync办法;异步发送为MQClientAPIImpl#sendMessageSync;单向比较简单,直接调用nettyClient发送恳求即可; 以上完成其实都是调用的RemotingClient类,我们有对netty感兴趣的可以自行研究,这儿就先不展开讲了。

六、小结

本文首要简单为我们介绍了下RocketMQ的音讯相关规划与生产者一些概念和流程,下篇文章将会带着我们一起看看RocketMQ消费者相关流程完成