Windows 2003-32bit上RabbitMQ不定期崩溃

来源:互联网 发布:乒乓球成品拍 知乎 编辑:程序博客网 时间:2024/06/06 15:01

转载请注明出处: jiq•钦's technical Blog - 季义钦

现象:

最近一个系统用到了RabbitMQ消息中心,这个系统又必须用于替换旧的系统,所以就有了必须运行在Windows 2003 32bit机器上面的限制。

因为需求获取原因,所以可以说到了集成测试阶段才知道这个限制,当系统跑起来的时候,发现一个致命性问题:RabbitMQ Broker(NT服务)不定期崩溃。

打开windows事件管理器看到错误如下:


但是在windows 2003 64bit和windows 2008上面运行都没有任何问题。


发现问题:

根据这个错误,猜测是RabbitMQ运行时调用某个函数出了问题,因为这个dll是存在的并没有丢失,所以想先测试一下到底是哪种RabbitMQ使用方式导致出了问题,所以写了发送接收,发布订阅等测试程序测了一下,运行良好。

看来我写的这些测试程序都无法触发这个错误重现,于是正常使用系统,然后在Web管理界面观察消息吞吐量,这个时候意外发现用到的消息队列上面竟然驻留了好几十万条消息了,怎么可能,我们系统所有用到RabbitMQ的地方我都了解,同一时刻不可能达到这么大的量,于是我开始思考为什么。。。

我的测试程序和系统有什么较大的区别?

对了,是通道,Shovel。

这里 有针对通道的详细介绍,这里就不一一赘述了,我们采用的是动态通道(Dynamic Shovels),通过Web管理界面或者dos命令动态创建和删除,比较灵活。

 

我们系统是全国分布式部署,为了消息可靠性,能够容忍WAN环境,所以采用Shovel插件来连接各个省份的消息中心,难道是通道引起的么?继续思考。。。

突然想到一种类似于一颗弹珠在一个封闭空间内不停弹射出现数量爆炸式增长的的现象,难道我的通道出现了死循环么?

再三检查一下发现的确如此:

1 我们每个分布式RabbitMQbroker称为一个省分中心;

2 每个省份中心都用自身的省编码作为消息路由的路由键;

3 建立的所有通道的确都已经设置了消息推送的路由键;

4 所有省分中心都建立了各种出去和进来的通道;

5 所有带有路由键的消息都能够正确路由到对应的省分中心;

 

一切看起来似乎很美好,但是忽略了一个很恶心的事实:

对于不带路由键的消息,可以通过带有任何路由键的通道推送出去。

就是这个原因,因为我们开发的客户端库有一种模式发送出去的消息没有路由键,导致这么一条消息进入这个系统之后,开始在各个省分中心之间不停“弹射”,最终爆炸式增长。

 

解决方法:

确保跨省分中心传送的消息(可能经过通道)都必须带有路由键。

 

为什么只有Windows2003 32bit会崩溃?

经过测试,发现Windows 200332bit在单个消息队列驻留的消息量达到80w左右,就会导致RabbitMQ Broker崩溃。而windows 2008和windows 2003 64bit都可以在150W以上的消息量的时候都还能稳定运行,至于上限是多少没有具体测试。

至于为什么会有这个区别,明显跟操作系统位数相关,具体原因有待继续研究。

1 0