iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何解决RabbitMq消息队列Qos Prefetch消息堵塞问题
  • 870
分享到

如何解决RabbitMq消息队列Qos Prefetch消息堵塞问题

2023-06-29 01:06:06 870人浏览 泡泡鱼
摘要

本篇内容介绍了“如何解决RabbitMQ消息队列Qos Prefetch消息堵塞问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

本篇内容介绍了“如何解决RabbitMQ消息队列Qos Prefetch消息堵塞问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

ConnectionFactory:创建connection的工厂类

Connection: 简单理解为Socket

Channel:和MQ交互的接口,定义queue、exchange和绑定queue、exhange等接口都是它。

接下来就是和mq的交互类

exchange:简单地看成路由,类型不是重点,看看官网即可

queue:客户端监听的是queue,而不是exchange,但是使用queue的前提要先将exchange和queue绑定。用过java queue工具类应该很容易上手,queue分为写和读,各自可以有自己频率,写得快读得慢,容易堵塞;写得慢读得快又容易造成消费者的空闲。

Prefetc:一个重要却容易被忽略的指标,也是这次遇到的问题。

prefetch与消息投递

prefetch是指单一消费者最多能消费的unacked messages数目。

如何理解呢?

mq为每一个 consumer设置一个缓冲区,大小就是prefetch。每次收到一条消息,MQ会把消息推送到缓存区中,然后再推送给客户端。当收到一个ack消息时(consumer 发出baseack指令),mq会从缓冲区中空出一个位置,然后加入新的消息。但是这时候如果缓冲区是满的,MQ将进入堵塞状态。

更具体点描述,假设prefetch值设为10,共有两个consumer。也就是说每个consumer每次会从queue中预抓取 10 条消息到本地缓存着等待消费。同时该channel的unacked数变为20。而Rabbit投递的顺序是,先为consumer1投递满10个message,再往consumer2投递10个message。如果这时有新message需要投递,先判断channel的unacked数是否等于20,如果是则不会将消息投递到consumer中,message继续呆在queue中。之后其中consumer对一条消息进行ack,unacked此时等于19,Rabbit就判断哪个consumer的unacked少于10,就投递到哪个consumer中。

我遇到的问题是一个粗心的程序员,在编写代码的时候,他对某些消息处理方式是这样的

  if (success) {                        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);                    } else {                        logger.error("######### The message is not delete from queue : {}", body);                    }

首先他讲ack机制设置为手动的,然后他的理解是如果处理成功的消息,就ack给MQ,期望MQ就可以删除完成的数据。不然,保留数据再次被处理。

这里的误区就是就是对ack的理解,失败的时候,如果需要让程序继续处理,应该使用basicNack,并告诉mq将消息再次放入队列

    if (success) {                            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);                        } else {                            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);                        }

对于客户端意外宕机的情况,没有ack服务器确实不会删除掉数据,但是consumer重启以后,对于服务器就是一个新的消费者了,也就是它的缓冲区又被重置为原来的n-prefetch,所以这个问题被粗心的小哥想当然地测试通过了。

prefetch的大小应该为多少

这篇文章给了很好的建议,我简单地说一下我的理解。

理想状况下,计算MQ SERVER 从缓冲区中拿到消息并推送到消费端,加上消费端处理完ack消息到MQ server,的时间,假设为100ms,其中消费端处理业务话费了10ms。

这里可以得出我们 prefetch = 100ms / 10ms = 10,也就是消息来回的总时间/业务处理的时间,这里要求我们 prefetch >= 10。一般计算这个时间不会太准确只能毛姑姑的,所以prefetch一般要大一点。但是这个值也不能太大,不然消费端就一只处于空闲状态了。

所以如果你保证所有的消息都ack了,但是还是出现比较长时间的堵塞,你就或者加大一点prefetch,或者多加一些机器,或者减少业务处理的时间了。一开始建议采用或者,使用一个线程池来处理这些业务逻辑。

“如何解决RabbitMq消息队列Qos Prefetch消息堵塞问题”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何解决RabbitMq消息队列Qos Prefetch消息堵塞问题

本文链接: https://www.lsjlt.com/news/321843.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决RabbitMq消息队列Qos Prefetch消息堵塞问题
    mq是实现代码扩展的有利手段,个人喜欢用概念来学习新知识,介绍堵塞问题的之前,先来段概念的学习。 ConnectionFactory:创建connection的工厂类 Connect...
    99+
    2022-11-13
  • 如何解决RabbitMq消息队列Qos Prefetch消息堵塞问题
    本篇内容介绍了“如何解决RabbitMq消息队列Qos Prefetch消息堵塞问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-29
  • linux消息队列堵塞如何解决
    在Linux中,可以使用以下方法解决消息队列堵塞的问题:1. 设置非阻塞模式:在打开消息队列时,通过设置O_NONBLOCK标志可以...
    99+
    2023-10-10
    linux
  • Java RabbitMQ消息队列详解常见问题
    目录消息堆积保证消息不丢失死信队列延迟队列RabbitMQ消息幂等问题RabbitMQ消息自动重试机制合理的选择重试机制消费者开启手动ack模式rabbitMQ如何解决消息幂等问题R...
    99+
    2022-11-13
  • RabbitMQ 如何解决消息幂等性的问题
    前言 关于MQ消费者的幂等性问题,在于MQ的重试机制,因为网络原因或客户端延迟消费导致重复消费。使用MQ重试机制需要注意的事项以及如何解决消费者幂等性问题以下将逐一讲解。 1. Ra...
    99+
    2022-11-12
  • linux消息队列出错如何解决
    出现Linux消息队列错误,可以按照以下步骤进行解决:1. 检查错误信息:首先查看错误提示,一般会给出具体的错误信息或错误码,例如返...
    99+
    2023-10-10
    linux
  • redis消息队列丢失如何解决
    要解决Redis消息队列丢失的问题,可以考虑以下几点:1. 持久化存储:Redis提供了持久化存储的功能,可以将消息在内存中的数据持...
    99+
    2023-09-04
    redis
  • 在Go语言中如何解决并发消息队列问题?
    在Go语言中如何解决并发消息队列问题?消息队列在现代应用程序中被广泛应用,用于处理异步任务、解耦系统组件、实现消息传递等。然而,在高并发情况下,消息队列的性能和并发处理能力成为了关键问题。在Go语言中,我们可以借助Go协程和通道来解决这个问...
    99+
    2023-10-22
    Go语言 并发 消息队列 关键词:
  • mq消息丢失问题如何解决
    这篇“mq消息丢失问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mq消息丢失问...
    99+
    2022-10-19
  • C#开发中如何处理消息队列和异步通信问题
    C#开发中如何处理消息队列和异步通信问题引言:在现代软件开发中,随着应用程序的规模和复杂程度不断增加,有效处理消息队列和实现异步通信变得非常重要。一些常见的应用场景包括分布式系统间的消息传递、后台任务队列的处理、事件驱动的编程等。本文将探讨...
    99+
    2023-10-22
    消息队列 异步通信 C#开发
  • 如何解决iPhone上缺少彩信消息选项的问题
    尽管有许多不同的社交媒体应用程序可以将图像,音乐文件和视频发送给WhatsApp和Snapchat等其他人,但一些iPhone用户仍然更喜欢将彩信发送给他们的朋友和封闭的朋友。最近,许多iPhone用户认为他们无法从iPhone发送任何彩信...
    99+
    2023-08-19
  • 在Go语言中如何解决并发消息广播问题?
    在Go语言中如何解决并发消息广播问题?随着互联网的发展,越来越多的应用需要实现消息广播功能,即将一条消息发送给多个接收者。在并发的环境中,要确保消息能够被所有接收者同时接收,而不会出现竞争条件或漏接的情况。在Go语言中,通过使用通道和协程,...
    99+
    2023-10-22
    互斥锁(Mutex) 读写锁(RWMutex) 通道(Channels)
  • 如何解决使用pyqt弹出消息提示框的问题
    这篇文章给大家分享的是有关如何解决使用pyqt弹出消息提示框的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。安装 pyqtPyQt5是python模块,可让您非常快速地构建GUI应用程序。通常将它与Tkint...
    99+
    2023-06-26
  • 如何解决JDK安全证书错误消息No subject alternative names present问题
    小编给大家分享一下如何解决JDK安全证书错误消息No subject alternative names present问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解...
    99+
    2023-06-04
  • C#开发中如何处理分布式事务和消息传递问题及解决方法
    C#开发中如何处理分布式事务和消息传递问题及解决方法在分布式系统中,分布式事务和消息传递是常见的问题。分布式事务指的是涉及多个数据库或服务的事务,而消息传递则指的是系统中不同组件之间的异步通信。本文将介绍在C#开发中如何处理这些问题,并提供...
    99+
    2023-10-22
    分布式 传递 处理 分布式事务处理:事务 消息传递问题:消息
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作