架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20247|回复: 0

RabbitMQ BasicQos消费者并行处理限制

[复制链接]
发表于 2018-4-10 22:36:02 | 显示全部楼层 |阅读模式
QQ截图20180410221200.jpg

首先,我们rabbitmq服务器有100条未处理的消息,我们随便打开一个消费者客户端,会出现下面情况,

100条数据,瞬间全部推送过来,但是,我们单个客户端无法同时处理这么多数据,怎么办?

QQ截图20180410221253.jpg


如上图,我们并没有确认收到消息!如果生产者源源不断的发送,我们消费者就会不停的接收!

试想一下,如果,我们单个消费者1分钟最多处理60条消息,但是,生产者1分钟可能会发送300条消息,如果,我们一台消费者客户端,1分钟同时要接收到300条消息,已经超过我们最大的负载,这时,就可能导致,服务器资源被耗尽,消费者客户端卡死等情况
RabbitMQ提供了一种qos(服务质量保证)功能,即在非自动确认消息的前提下,如果一定数目的消息(通过基于consume或者channel设置Qos的值)未被确认前,不进行消费新的消息。



prefetchSize:0
prefetchCount:会告诉RabbitMQ不要同时给一个消费者推送多于N个消息,即一旦有N个消息还没有ack,则该consumer将block掉,直到有消息ack
global:true\false 是否将上面设置应用于channel,简单点说,就是上面限制是channel级别的还是consumer级别
备注:据说prefetchSize 和global这两项,rabbitmq没有实现,暂且不研究


prefetch_count在no_ask=false的情况下生效即在自动应答的情况下这两个值是不生效

通过 BasicQos 方法设置prefetchCount = 3。这样RabbitMQ就会使得每个Consumer在同一个时间点最多处理3个Message。换句话说,在接收到该Consumer的ack前,他它不会将新的Message分发给它。 设置方法如下:

mq3.gif

QQ截图20180410223049.jpg

图中可以看出有两个消费者同时监听Queue,但是注意这里的消息只有被一个消费者消费掉就会自动ack,另外一个消费者就不会再获取到此消息,Prefetch Count为配置设置的值3,意味着每个消费者每次会预取3个消息准备消费。

官网介绍:http://www.rabbitmq.com/consumer-prefetch.html

注意,这种方法可能会导致queue满。当然,这种情况下你可能需要添加更多的Consumer,或者创建更多的virtualHost来细化你的设计。





上一篇:EF 实现大批量数据库插入更新删除操作
下一篇:无法启动iis express web 服务器
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-17 03:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表