RocketMQ分析:PushConsumer流量控制

   本文分析PushConsumer的流量控制方法。PushConsumer使用Pull方式获取消息,好处是客户端能够根据自身的处理速度调整获取消息的操作速度。PushConsumer的流量控制采用多线程处理方式。

    RocketMQ的版本为:4.2.0 release。

一.PushConsumer使用线程池,每个线程同时执行对应的消息处理逻辑

     线程池的定义在 PushConsumer 启动的时候,初始化consumeMessageService的时候,在构造方法里面创建的。

    DefaultMQPushConsumer#start

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#66d9ef"><span style="color:#f92672">public</span></span> <span style="color:#66d9ef"><span style="color:#f92672">void</span></span> <span style="color:#e6db74"><span style="color:#a6e22e">start</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">(</span></span><span style="color:#f8f8f2"><span style="color:#f8f8f2">)</span></span> <span style="color:#66d9ef"><span style="color:#f92672">throws</span></span> MQClientException <span style="color:#f8f8f2">{</span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>defaultMQPushConsumerImpl<span style="color:#f8f8f2">.</span><span style="color:#e6db74">start</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
<span style="color:#f8f8f2">}</span></code></span></span>

    DefaultMQPushConsumerImpl#start

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#66d9ef"><span style="color:#f92672">if</span></span> <span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getMessageListenerInner</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span> <span style="color:#66d9ef"><span style="color:#f92672">instanceof</span></span> MessageListenerOrderly<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>consumeOrderly <span style="color:#f8f8f2">=</span> <span style="color:#ae81ff"><span style="color:#f92672">true</span></span><span style="color:#f8f8f2">;</span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>consumeMessageService <span style="color:#f8f8f2">=</span>
    <span style="color:#66d9ef"><span style="color:#f92672">new</span></span> ConsumeMessageOrderlyService<span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">(</span>MessageListenerOrderly<span style="color:#f8f8f2">)</span> <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getMessageListenerInner</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
<span style="color:#f8f8f2">}</span> <span style="color:#66d9ef"><span style="color:#f92672">else</span></span> <span style="color:#66d9ef"><span style="color:#f92672">if</span></span> <span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getMessageListenerInner</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span> <span style="color:#66d9ef"><span style="color:#f92672">instanceof</span></span> MessageListenerConcurrently<span style="color:#f8f8f2">)</span> <span style="color:#f8f8f2">{</span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>consumeOrderly <span style="color:#f8f8f2">=</span> <span style="color:#ae81ff"><span style="color:#f92672">false</span></span><span style="color:#f8f8f2">;</span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>consumeMessageService <span style="color:#f8f8f2">=</span>
    <span style="color:#66d9ef"><span style="color:#f92672">new</span></span> ConsumeMessageConcurrentlyService<span style="color:#f8f8f2">(</span><span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">,</span> <span style="color:#f8f8f2">(</span>MessageListenerConcurrently<span style="color:#f8f8f2">)</span> <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span><span style="color:#e6db74">getMessageListenerInner</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span>
<span style="color:#f8f8f2">}</span></code></span></span>

    ConsumeMessageOrderlyService#ConsumeMessageOrderlyService    构造方法 :

<span style="color:#333333"><span style="color:#f8f8f2"><code class="language-java"><span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>consumeExecutor <span style="color:#f8f8f2">=</span> <span style="color:#66d9ef"><span style="color:#f92672">new</span></span> ThreadPoolExecutor<span style="color:#f8f8f2">(</span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>defaultMQPushConsumer<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getConsumeThreadMin</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span><span style="color:slategray"><span style="color:#75715e">// 线程池初始化时线程数量</span></span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>defaultMQPushConsumer<span style="color:#f8f8f2">.</span><span style="color:#e6db74">getConsumeThreadMax</span><span style="color:#f8f8f2">(</span><span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">,</span><span style="color:slategray"><span style="color:#75715e">// 线程池最大线程数</span></span>
    <span style="color:#ae81ff"><span style="color:#ae81ff">1000</span></span> <span style="color:#f8f8f2">*</span> <span style="color:#ae81ff"><span style="color:#ae81ff">60</span></span><span style="color:#f8f8f2">,</span>
    TimeUnit<span style="color:#f8f8f2">.</span>MILLISECONDS<span style="color:#f8f8f2">,</span><span style="color:slategray"><span style="color:#75715e">// 线程保持活着的空闲时间,60秒</span></span>
    <span style="color:#66d9ef"><span style="color:#f92672">this</span></span><span style="color:#f8f8f2">.</span>consumeRequestQueue<span style="color:#f8f8f2">,</span><span style="color:slategray"><span style="color:#75715e">// 排队等待线程队列</span></span>
    <span style="color:#66d9ef"><span style="color:#f92672">new</span></span> ThreadFactoryImpl<span style="color:#f8f8f2">(</span><span style="color:#a6e22e"><span style="color:#e6db74">"ConsumeMessageThread_"</span></span><span style="color:#f8f8f2">)</span>
<span style="color:#f8f8f2">)</span><span style="color:#f8f8f2">;</span></code></span></span>

原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值