MessageQueue顾名思义消息队列在系统开发中也是用的比较多的一个中间件吧。我们这里主要用它来做日志管理和订单管理的记得老老大恩是的就是老老大因为他已经跳槽了还在的时候当时也是为了赶项目进度他也参与开发了那时候我才刚刚入职他负责写后端这块我来了就把他手上的任务接过来了接着接着……就辞职了。之后我们的开发仍然有条不紊的开发着直到今年的一月份吧才上线开始运行然后就出现了常规状态上线之后就开始爆炸这个页面打不开呀那个内容没东西呀第三方登录问题呀支付问题呀临时再改需求呀……该来的都来了加班、debug、测试、再debug……然后经过几天的修复终于完成了跟自己电脑一样稳定的运行组员们都美滋滋的今晚加个鸡腿才行。都说祸不单行古人是不会骗我们的Bug怎么会修得完呢天真要是Bug能修得完还要我们来干啥好景不长果然过了一周之后组员突然群里叫喳喳what is it ?来了今天的主角登场了我也要开始加班了。RabbitMQ这个是今天要说的东西基础概念什么的不是今天要说的重点重点是RabbitMQ内存暴涨使得整个服务器濒临瘫痪远程登录服务器都差点挤不进去的状态别看截图目前才1.3G吃个午饭回来就2.3G了可怕不可怕咋回事老板喊你回来加班啦先不管了线上优先解决手动先Reset回收资源以释放空间这个只是临时的办法然后检查一下rabbitMQ的配置有没有问题路径在C:\Users\Administrator\AppData\Roaming\RabbitMQ完全是默认的配置完全ojbk啊那到底咋回事继续检查想想不如从项目开始吧然后查看项目中的代码都是从来自【MessageLib】的组件调用好了叫我老老大要这个组件的代码他把git的地址就发给我我把项目down下来这个封装的组件内容不多主要的文件一目了然其实就是用到这个两个组件来进行的二次封装来调用主要的代码是在【MessageQueue.cs】文件里展示一下当时的代码情况View Code然后我就发现了这一段代码/// summary /// 程序自运行并开始监听 /// /summary public static void Run() { System.Timers.Timer timer new System.Timers.Timer(); timer.Interval 1000; timer.Elapsed new System.Timers.ElapsedEventHandler(Pulish);//到达时间的时候执行事件 timer.AutoReset true;//设置是执行一次false还是一直执行(true) timer.Enabled true;//是否执行System.Timers.Timer.Elapsed事件 }/// summary /// 启动线程异步调用 /// /summary /// param namechannelType/param private static void Send(string channelType) { Thread thread new Thread(new ParameterizedThreadStart(PublishAction)); thread.IsBackground true; thread.Start(channelType); }老老大写Bug了当Run()起来之后队列中【NoticQueue】有内容就开始推送消息发送消息Send()每来一次推送new一个线程并设置为后台线程然后发送消息。好了明白了这里的线程很混乱因为线程操作不当new了N多个频道并且没有主动回收这也难怪内存暴涨呢。并且要是Run()调用多次后果更加不堪设想。加班改起来开始动手吧业务主要推送有普通消息、错误消息和通知消息那么将队列与线程组装一起新增一个类QueueTask.cs