消息堆积最佳实践

<p class="shortdesc">消息堆积是消费者客户端常出现的问题,本文主要介绍如何解决消费端消息堆积问题。</p> <section class="section" id="message_stacking__section_opb_wwk_5mb"><h2 class="doc-tairway">消息堆积出现的原因</h2> <p class="p">造成消息堆积的原因通常有两个:</p> <ol class="ol" id="message_stacking__ol_bwt_wwk_5mb"> <li class="li">消费者的消费速度小于消息的生产速度。</li> <li class="li">消息消费失败后,消费者仍不断尝试执行消费逻辑。这种情况可能会出现消费线程阻塞,无法继续向前推进,从而造成消息堆积。</li> </ol> </section> <section class="section" id="message_stacking__section_ofb_xwk_5mb"><h2 class="doc-tairway">消息堆积解决方案</h2> <p class="p"><strong class="ph b">提高消费速度</strong></p> <p class="p">针对消息消费速度小于消息生产速度的情况,通常可以采取以下两种方式提高消费速度:</p> <ul class="ul" id="message_stacking__ul_udy_pxk_5mb"> <li class="li"><strong class="ph b">增加 Consumer 实例数量</strong></li> </ul> <p class="p">可部署多个消费实例,但需注意消费实例数量需小于或等于Topic的分区数量,否则将有消费实例因为分配不到任何分区而处于空闲状态,此时,再增加实例数量,也无法继续提升消费速度。另外,在一个实例对应一个线程的情况下,还可以直接在进程内增加消费实例数量。</p> <ul class="ul" id="message_stacking__ul_mjj_nxk_5mb"> <li class="li"><strong class="ph b">增加消费线程</strong></li> </ul> <p class="p">增加 Consumer 实例数量本质上也是通过增加线程的方式来提升速度,因此增加消费线程是更直接,也是更重要的性能提升方式,基本的实现步骤如下:</p> <ol class="ol" id="message_stacking__ol_urm_2xk_5mb"> <li class="li">定义一个线程池。</li> <li class="li">Poll 数据。</li> <li class="li">把数据提交到线程池进行并发处理。</li> <li class="li">等并发结果返回成功后,再次 poll 数据。</li> </ol> <p class="p"><strong class="ph b">避免消费阻塞</strong></p> <p class="p">Kafka 消费者客户端消费消息的基本流程如下:</p> <ol class="ol" id="message_stacking__ol_xc5_jxk_5mb"> <li class="li">Poll 数据。</li> <li class="li">执行消费逻辑。</li> <li class="li">再次 poll 数据。</li> </ol> <p class="p">消费端拿到消息后,执行消费逻辑,通常会执行一些远程调用,此时若同步等待结果,则可能造成一直等待,消费进程无法向前推进的情况。若存在等待调用结果的情况,建议设置等待的超时时间,超时后即作为消费失败的情况处理,避免堵塞消费线程。</p> </section>
以上内容是否解决了您的问题?
请补全提交信息!
联系我们

电话咨询

400-151-8800

邮件咨询

fincloud@ocft.com

在线客服

工单支持

解决云产品相关技术问题