问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

RabbitMQ消费者性能优化相关配置说明

发布网友 发布时间:2022-09-12 06:09

我来回答

1个回答

热心网友 时间:2024-06-30 05:39

RabbitMQ是用Erlang语言编写的分布式消息中间件,常常用在大型网站中作为消息队列来使用,主要目的是各个子系统之间的解耦和异步处理。消息中间件的基本模型是典型的生产者-消费者模型,生产者发送消息到消息队列,消费者监听消息队列,收到消息后消费处理。

在使用RabbitMQ做消息分发时,主要有三个概念要注意:Exchange,RoutingKey,Queue。
Exchange可以理解为交换器,RoutingKey可以理解为路由,Queue作为真实存储消息的队列和某个Exchange绑定,具体如何路由到感兴趣的Queue则由Exchange的三种模式决定:

(1)Exchange为fanout时,生产者往此Exchange发送的消息会发给每个和其绑定的Queue,此时RoutingKey并不起作用;
(2)Exchange为topic时,生产者可以指定一个支持通配符的RoutingKey(如demo.*)发向此Exchange,凡是Exchange上RoutingKey满足此通配符的Queue就会收到消息;
(3)direct类型的Exchange是最直接最简单的,生产者指定Exchange和RoutingKey,然后往其发送消息,消息只能被绑定的满足RoutingKey的Queue接受消息。(通常如果不指定RoutingKey的具体名字,那么默认的名字其实是Queue的名字)

消费端yml配置:

在消费端,配置prefectch和concurrency参数便可以实现消费端mq并发处理消息,那么这两个参数具有有什么含义呢?

prefetch是每次从一次性从broker里面取的待消费的消息的个数。

每个customer会在MQ预取一些消息放入内存的LinkedBlockingQueue中进行消费,这个值越高,消息传递的越快,但非顺序处理消息的风险更高。如果ack模式为none,则忽略。

prefetch默认值以前是1,这可能会导致高效使用者的利用率不足。从spring-amqp 2.0版开始,默认的prefetch值是250,这将使消费者在大多数常见场景中保持忙碌,从而提高吞吐量。

不过在有些情况下,尤其是处理速度比较慢的大消息,消息可能在内存中大量堆积,消耗大量内存;以及对于一些严格要求顺序的消息,prefetch的值应当设置为1。

对于低容量消息和多个消费者的情况(也包括单listener容器的concurrency配置)希望在多个使用者之间实现更均匀的消息分布,建议在手动ack下并设置prefetch=1。

如果要保证消息的可靠不丢失,当prefetch大于1时,可能会出现因为服务宕机引起的数据丢失,故建议将prefetch=1。

concurrency设置的是对每个listener在初始化的时候设置的并发消费者的个数。在上面的yml配置中,concurrency=1,即每个Listener容器将开启一个线程去处理消息。在2.0以后的版本中,可以在注解中配置该参数:

在服务启动后,可以发现在Listener容器中产生了两个线程去消费queue。如果在Listener配置了exclusive参数,即确定此容器中的单个customer是否具有对队列的独占访问权限。如果为true,则容器的并发性必须为1。

若一个消费者配置prefetch=10,concurrency=2,会有两个消费者(或是线程)同时监听Queue,但是注意这里的消息只要有被一个消费者消费掉就会自动ack,另外一个消费者就不会再获取到此消息,Prefetch Count为配置设置的值10,意味着每个消费者每次会预取10个消息准备消费(注意不是两个消费者去共享内存中抓取的消息)。

每个消费者对应的listener有个Exclusive参数,默认为false, 如果设置为true,concurrency就必须设置为1,即只能单个消费者消费队列里的消息,适用于必须严格执行消息队列的消费顺序(先进先出)。

前面说过,设置并发的时候,要考虑具体的业务场景,对那种对消息的顺序有苛刻要求的场景不适合并发消费,而对于其他场景,比如用户注册后给用户发个提示短信,是不太在意哪个消息先被消费,哪个消息后被消费,因为每个消息是相对独立的,后注册的用户先收到短信也并没有太大影响。

设置并发消费除了能提高消费的速度,还有另外一个好处:当某个消费者长期阻塞,此时在当前消费者内部的BlockingQueue的消息也会被一直阻塞,但是新来的消息仍然可以投递给其他消费者消费,这种情况顶多会导致prefetch个数目的消息消费有问题,而不至于单消费者情况下整个RabbitMQ的队列会因为一个消息有问题而全部堵死。所有在合适的业务场景下,需要合理设置concurrency和prefetch值。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
这是个成本会计题,马上要考这道原题了,求大虾帮忙 财务管理类问题,求大虾帮忙,小弟感激不尽。具体问题看问题补充。_百度... 光影魔术手怎么换底色 光影魔术手换底色教程 ...米的绳子围绕一棵树干饶了6圈,还余下1.16米,这棵树干上的直径大约是... ...还余下1.16米,这棵树的树干的直径大约是多少米?求算式! ibm x3500 M5 服务器 运行时风扇声音好大,吵死了,可以下掉一个吗... IBMX3500 M5,最近老是出现自动关机的情况,需要把服务器电源拔掉半分钟... 治疗萎缩性胃炎的方法 怎么治萎缩胃炎 JYF-40FS06电饭煲190块买的是假的吗 RabbitMQ集群 详解RabbitMQ集群原理,值得收藏 RabbitMQ - 5种工作模式 花呗借呗无力偿还怎么协商延期 有要烘干的苦瓜片的吗? 苦瓜茶一天喝多少对降血糖比较好?就是量。比如多少克?或者几片? 一次买10斤,晒干囤起来,随吃随取特省事的食物有哪些? 苦瓜片多少钱一斤哪里能买到 最近中山东风安乐附近什么地方回收旧版人民币。 如果借呗和花呗同时逾期,把钱存到支付宝里,会先划扣到哪里? 南瓜泥,山药泥,胡萝卜泥,宝宝应该先添哪个 百合花开完花后还有什么用? 花鳉在哪钓? 赤壁钓鱼任务蚯蚓用没了怎么办? 易捷钱包如何绑定多辆车- 问一问 医院院长工作心得总结 ...最好是面试接待 别的也可以,要和行政或文员前台工作相关的... 财务人员应具备哪些品行 做为一个会计,如何培养认真严谨的态度和习惯? 苹果手机照片到华为怎么变模糊 RabbitMQ 镜像集群 宕机恢复、负载均衡、跨机房多活 消息队列(Message Queue) 小学英语《At a farm 》说课稿 月月享富国安福30天能买吗 博时月月享30天保本金吗 旧版人民币在哪回收? 学生证磁条里的信息在哪改 支付宝提现要收费了,支付宝在什么情况下提现收费 什么情况,支付宝也要收费 怎样可以快速的把银行卡信息更换了? PVC磁性卡数据怎么修改和创建?要用什么机器读取和写入? 周公解梦梦见被一个人牵着手走,中途突然不见了 花呗被停用了是怎么回事 第三套人民币大全全新没有手印去哪儿回收?回收什么价? 那里回收第三套人民币和分硬币,价多少钱 怎样在消费者权益保护委员会撤消投诉 在消费保平台投诉的问题跟商家已协商好,商家要求撤诉后才能赔钱,请问怎 ... 哪里收人民币大全套? 港版ps4怎么捆绑招商银行信用卡支付 黄洋界的历史