mq是实现代码扩展的有利手段,个人喜欢用概念来学习新知识,介绍堵塞问题的之前,先来段概念的学习。
connectionfactory
:创建connectio七子之歌翻译n的工厂类
connection
: 简单理解为socket
channel
:和mq交互的接口,定义queue、exchange和绑定queue、exhange等接口都是它。
接下来就是和mq的交互类
exchange
:简单地看成路由,类型不是重点,看看官网即可
queue
:客户端监听的是queue,而不是exchange,但是使用queue的前提要先将exchange和queue绑定。用过java queue工具类应该很容易上手,queue分为写和读,各自可以有自己频率,写得快读得慢,容易堵塞;写得慢读得快又容易造成消费者的空闲。
prefetc
:一个重要却容易被忽略的指标,也是这次遇到的问题。
prefetch与消息投递
prefetch是指单一消费者最多能消费的unack天天向上学习网ed messages数目。
如何理解呢?
mq为每一个 consumer设置一个缓冲区,大小就是prefetch。每次收到一条消息,mq会把消息推送到缓存区中,然后再推送给客户端。当收到一个ack消息时(consumer 发出baack指令),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.bas名人故事素材icack(message.getmessageproperties().getdeliverytag(), fal); 电脑显示器亮度 } el { logger.error("######### the message is not delete from queue : {}", body); }
首先他讲ack机制设置为手动的,然后他的理解是如果处理成功的消息,就ack给mq,期望mq就可以删除完成的数据。不然,保留数据再次被处理。
这里的误区就是就是对ack的理解,失败的时候,如果需要让程序继续处理,应该使用basicnack,并告诉mq将消息再次放入队列
if (success) { channel.basicack(message.getmessageproperties().getdeliverytag(), fal); } el { channel.basicnack(message.getmessageproperties().getdeliverytag(), fal, true); }
对于客户端意外宕机的情况,没有ack服务器确实不会删除掉数据,但是consumer重启以后,对于服务器就是一个新的消费者了,也就是它的缓冲区又被重置为原来的n-prefetch,所以这个问题被粗心的小哥想当然地测试通过了。
prefetch的大小应该为多少
这篇文章给了很好的建议,我简单地说一下我的理解。
理想状况下,计算mq rver 从缓冲区中拿到消息并推送到消费端,加上消费端处理完ack消息到mq rver,的时间,假设为100ms,其中消费端处理业务话费了10ms。
这里可以得出我们 prefetch = 100ms / 10ms = 10,也就是消息来回的总时间/业务处理的时间,这里要求我们 prefetch >= 10。一般计算这个时间不会太准确只能毛姑姑的,所以prefetch一般要大一点。但是这个值也不能太大,不然消费端就一只处于空闲状态了。
所以如果你保证所有的消息都a自拟题目的作文ck了,但是还是出现比较长时间的堵塞,你就或者加大一点prefetch,或者多加一些机器,或者减少业务处理的时间了。一开始建议采用或者,使用一个线程池来处理这些业务逻辑。
以上就是解决rabbitmqqosprefetch消息堵塞问题的详细内容,更多关于rabbitmqqosprefetch消息堵塞的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-04 21:16:52,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/60667e4f85422c937672c0fb2bffca39.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:解决RabbitMq消息队列Qos Prefetch消息堵塞问题.doc
本文 PDF 下载地址:解决RabbitMq消息队列Qos Prefetch消息堵塞问题.pdf
留言与评论(共有 0 条评论) |