一、音讯发送的几种办法
1. 同步
音讯生产者向MQ发送音讯时分,同步等候,直到服务器回来发送成果,即牢靠的同步传输。
2. 异步
音讯生产者向MQ发送音讯时分,指定音讯发送成功后的回调函数,调用音讯API发送成功后,马上回来,不阻塞音讯发送流程,音讯发送成功后或者失利后回调使命在一个新的线程中履行,即牢靠的异步传输。
3. 单向
音讯生产者向MQ发送音讯时分,调用完音讯发送API后,直接回来,不等候音讯的发送成果,即单向
二、音讯的高可用规划
2.1 音讯发送重试机制
RocketMQ在音讯发送失利的时分,默许会重试2次
2.2 故障躲避机制
当音讯第一次发送失利的时分,假如下一次音讯发送仍是路由到刚才的Broker上,其音讯发送大概率是失利的,因而为了保证重试的牢靠性,在重试的时分会尽量避开刚刚接纳失利的Broker,而是选择其他Broker上的行列进行反送,然后进步音讯的发送成功率
三、音讯数据结构
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办法完成如下:
这儿注意创立的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:超时时间
音讯发送整体流程如下:
5.1 获取Broker网格地址
依据MessageMQ信息获取Broker地址,假如未获取到,则从NameServer主动更新topic路由信息。
5.2 生成音讯大局仅有id
为音讯生成大局仅有id(雪花算法,ip+时间戳+递增序号),假如音讯默许超过4KB,则对音讯采用zip压缩,假如是事物音讯,则设置音讯类型为MessageSysFlag.TRANSACTION_PREPARED_TYPE;
5.3 音讯增强
假如注册了音讯发送钩子函数,则履行音讯发送之前的增强逻辑。
5.4 构建音讯发送恳求
音讯体首要包含:生产者组、主题名称、默许创立主题key、行列数、行列id 音讯标记、发送时间等等。
5.5 履行发送
RocketMQ支撑三种音讯发送,因而,这儿也对应三种不同的音讯发送办法。同步发送完成为MQClientAPIImpl#sendMessageAsync办法;异步发送为MQClientAPIImpl#sendMessageSync;单向比较简单,直接调用nettyClient发送恳求即可; 以上完成其实都是调用的RemotingClient类,我们有对netty感兴趣的可以自行研究,这儿就先不展开讲了。
六、小结
本文首要简单为我们介绍了下RocketMQ的音讯相关规划与生产者一些概念和流程,下篇文章将会带着我们一起看看RocketMQ消费者相关流程完成