网站开发以图片为背景,泉州商城网站开发设计,如何构建电子商务网站,电商网站建设文献文章目录 消息发送代码实现消息发送者启动流程检查配置获得MQ客户端实例启动实例定时任务 Producer 消息发送流程选择队列默认选择队列策略故障延迟机制策略*两种策略的选择 技术亮点:ThreadLocal 消息发送代码实现
下面是一个生产者发送消息的demo#xff08;同步发送#… 文章目录 消息发送代码实现消息发送者启动流程检查配置获得MQ客户端实例启动实例定时任务 Producer 消息发送流程选择队列默认选择队列策略故障延迟机制策略*两种策略的选择 技术亮点:ThreadLocal 消息发送代码实现
下面是一个生产者发送消息的demo同步发送 主要做了几件事
初始化一个生产者DefaultMQProducer对象设置 NameServer 的地址启动生产者发送消息
消息发送者启动流程 DefaultMQProducerImpl类start() 检查配置
DefaultMQProducerImpl类 获得MQ客户端实例
整个JVM中只存在一个MQClientManager实例维护一个MQClientInstance缓存表。DefaultMQProducerImpl类start() 一个clientId只会创建一个MQClientInstance clientId生成规则IPinstanceNameunitName RocketMQ中消息发送者、消息消费者都属于”客户端“。每一个客户端就是一个MQClientInstance每一个ClientConfig对应一个实例。
不同的生产者、消费端如果引用同一个客户端配置(ClientConfig)则它们共享一个MQClientInstance实例。所以我们在定义的的时候要注意这种问题生产者和消费者如果分组名相同容易导致这个问题 启动实例
MQClientInstance类start() 定时任务
MQClientInstance类startScheduledTask() Producer 消息发送流程
我们从一个生产者案例的代码进入代码可知DefaultMQProducerImpl中的sendDefaultImpl()是生产者消息发送的核心方法 从核心方法可知消息发送就是4个步骤验证消息、查找路由、选择队列、消息发送。 选择队列
默认选择队列策略
采用了最简单的轮询算法这种算法有个很好的特性就是保证每一个Queue队列的消息投递数量尽可能均匀。这种算法只要消息投递过程中没有发生重试的话基本上可以保证每一个Queue队列的消息投递数量尽可能均匀。当然如果投递中发生问题比如第一次投递就失败那么很大的可能性是集群状态下的一台Broker挂了所以在重试发送中进行规避。这样设置也是比较合理的。
故障延迟机制策略*
采用此策略后每次向Broker成功或者异常的发送RocketMQ都会计算出该Borker的可用时间发送结束时间-发送开始时间失败的按照30S计算并且保存方便下次发送时做筛选。 除了记录Broker的发送消息时长之外还要计算一个Broker的不可用时长。这里采用一个经验值
如果发送时长在550ms之内不可用时长为0。
达到550ms不可用时长为30S
达到1000ms不可用时长为60S
达到2000ms不可用时长为120S
达到3000ms不可用时长为180S
达到15000ms不可用时长为600S 有了以上的Broker规避信息后发送消息就非常简单了。
在开启故障延迟机制策略步骤如下
根据消息队列表时做轮训选好一个队列判断该队列所在Broker是否可用如果是可用则返回该队列队列选择逻辑结束如果不可用则接着步骤2继续如果都不可用则随机选一个
代码如下 两种策略的选择
从这种策略上可以很明显看到默认队列选择是轮训策略而故障延迟选择队列则是优先考虑消息的发送时长短的队列。那么如何选择呢
首先RocketMQ默认的发送失败有重试策略默认是2也就是如果向不同的Broker发送三次都失败了那么这条消息的发送就失败了作为RocketMQ肯定是尽力要确保消息发送成功。所以给出以下建议。
如果是网络比较好的环境推荐默认策略毕竟网络问题导致的发送失败几率比较小。
如果是网络不太好的环境推荐故障延迟机制消息队列选择时会在一段时间内过滤掉RocketMQ认为不可用的broker以此来避免不断向宕机的broker发送消息从而实现消息发送高可用。
当然以上成立的条件是一个Topic创建在2个Broker以上的的基础上。
技术亮点:ThreadLocal