1.消息发送流程:
1.1消息长度验证
要求主题名称,消息体不能为空,消息长度大于0且小于等于4M.
2查询主题路由信息
2.1第一次发送消息,本地没有缓存topic的路由信息,查询NameServer尝试获取;如果获取不到,则用默认主题去查询,查询不到则报错。
2.2查询到的路由信息与本地缓存的路由信息进行对比,不一致则更新本地的;
2.3判读查询到的路由信息是否具备写权限,不具备写权限则跳过。
3选择消息队列
3.1默认为每个主题创建8个消息队列,如何选择队列发送?
根据路由算法,基于重试机制:假如根据路由算法发送到Queue1失败了,下次再发送时就会避开Queue1发送。
3.2假如发送消息到broker1失败(broker1宕机),如何让接下来的不发送到broker1?
开启故障延迟机制:当发送消息到broker1失败时,默认规避时间(可自定义)30秒内不会再发送消息到broker1。
原因:broker与NameServer每10秒发送一次心跳,但NameServer每30秒才会去检测broker是否可用。
3.3NameServer什么情况下会进行路由移除?
1.检测上一次心跳与当前系统时间相差120秒;
2.broker正常关闭,执行unregisterBroker方法。
4消息发送
4.1.产生一个全局唯一id;
4.2.发送方式:
4.2.1同步发送
消息发送到broker,阻塞等待,返回发送成功才能继续发送;
4.2.2异步发送
消息发送到broker,无需阻塞等待发送结果,提供一个回调函数,提高性能;
4.2.3单向发送
只发一次,发完即完,不提供重试。
本文详细阐述了消息发送流程,包括消息长度验证、主题路由信息查询、消息队列选择及消息发送方式等核心环节,深入探讨了同步、异步与单向发送的区别。

4274

被折叠的 条评论
为什么被折叠?



