博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RabbitMQ consumer的一些坑
阅读量:5981 次
发布时间:2019-06-20

本文共 1183 字,大约阅读时间需要 3 分钟。

坑就像是恶梦,总是在最不设防的时候出现,打的你满地找牙。这里记录一些坑,遇到的朋友可以及时的跳出,避免带来损失。

 

使用事件方式去获取queue中的消息,然后再进行处理。这看起来没什么问题,但是如果queue中的消息有几万条甚至才几十万条,一股脑的全丢给consumer会造成什么情况呢?

下面模拟一个例子,我们的queue中有着二千多条消息,每个消息处理的时间需要1s。为了消息的可靠性我们手动交付消息的处理状态。

using (var channel = RabbitMqHelper.GetConnection().CreateModel())            {                var consumer = new EventingBasicConsumer(channel);                consumer.Received += (sender, e) =>                {                    Console.WriteLine(Encoding.UTF8.GetString(e.Body));                    //处理时间                    Thread.Sleep(1000);                    //手动交付                    channel.BasicAck(e.DeliveryTag, false);                };                //不自动确认                channel.BasicConsume("lazyqueue", false, consumer);                Console.WriteLine("consumer启动成功");                Console.ReadKey();            }

这里是queue,可以看到有2847条消息

后面把程序运行起来,短短的时间里可以看到内存占用了一个多G!而CPU占用率也很高。如果再跑一会,啧啧 怕是要爆掉了。

这时再看我们的队列,什么? 才处理了一条消息。-.- 还好用的是手动确认机制,不然可能会丢失所有的消息。

 

处理方式也很简单,在之前的博文中也有说到,为了queue分发给consumer的消息是平均的,设置在同一时间一个consumer只处理一条消息,当处理完确认后再分发给consumer下一条消息,这听起来很靠谱。我们设置一下,再把程序跑起来

这时候再看,内存只占用了几M而已,这时候就显的轻松无比了

转载于:https://www.cnblogs.com/LiangSW/p/6233271.html

你可能感兴趣的文章
day-6 and day-7:面向对象
查看>>
CSU Double Shortest Paths 湖南省第十届省赛
查看>>
webgl像机世界
查看>>
php正则怎么使用(最全最细致)
查看>>
javascript数学运算符
查看>>
LC.155. Min Stack(非优化,两个stack 同步 + -)
查看>>
交互设计[3]--点石成金
查看>>
SCCM TP4部署Office2013
查看>>
bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
查看>>
利用console控制台调试php代码
查看>>
讲解sed用法入门帖子
查看>>
Linux 内核已支持苹果
查看>>
【二叉树系列】二叉树课程大作业
查看>>
ASP.NET Core 2 学习笔记(三)中间件
查看>>
hbase region split源码分析
查看>>
SurfControl人工智能新突破 领跑反垃圾邮件
查看>>
一个动态ACL的案例
查看>>
openstack 之 windows server 2008镜像制作
查看>>
VI快捷键攻略
查看>>
漫谈几种反编译对抗技术
查看>>