当学习RocketMQ时,首先得将RocketMQ的消息发送分为3种方式:同步,异步和单向。
同步:发送者向 MQ 执行发送消息 API 时,同步等待, 直到消息服务器返回发送结果。
异步:发送者向MQ执行发送消息API时,指定消息发送成功后的回调函数,然后调用消息发送API后,
立即返回,消息发送者线程不阻塞,直到运行结束,消息发送成功或者失败的回调任务在一个新的线程中执行。
单向:单向很好理解,其实就是producer执行完send方法后,就直接返回,不需要等待broker的结果,
也不注册回调函数,只管发,不care消息能否真正成功存储broker中。
RocketMQ消息发送常常会考虑以下三点:
1.消息队列如何进行负载
2.消息发送如何实现高可用
3.批量消息发送如何实现一致性
针对问题1:
producer在发送消息时,如果本地路由表中未缓存topic的路由信息,则向nameserver发送获取理由信息请求,
更新本地路由信息表,并且消息生产者每隔30s从nameserver更新路由表。
针对问题2:
主要通过两个手段:重试机制 和 broker的规避。broker的规避主要就是在一次消息发送过程中发现错误,在某一时间段内
消息生产者不会选择该broker的消息队列,提高发送消息的成功率。
针对问题3:
MessageBatch extends Message ,MessageBatch内部持有List<Message> messages,这样处理流程与单条消息一样。