我之前在做延迟消息的时候做了很多的尝试,也摒弃了很多的方案,其中就有RabbitMQ死信队列和延迟插件的使用,其实他们都有比较严重的局限性,但是这两天我在看博客时候发现呢,很多文章或者公众号大肆宣扬它的功能点,丝毫不提它的坑,甚至夸大其词说啥"拼多多百亿消息的实现"
,我觉得这样真的不太好,很容易误导别人,写扫盲文章点出来它的优点和缺点最好.滥用不研究很容易出现生产问题
我们基于TTL和死信队列(概念性的解释和demo可以看我之前的博客)做到延迟消息的局限性在于,延迟粒度是在队列级别的
,我们需要对队列设置固定的TTL,然后每个消息在进入队列时候拥有统一的初始化消息消亡时间,如果我们想要做到延迟时间随机必须要做到创建很多很多很多不同TTL的延迟队列.
由于运维那边没有预装RabbitMQ延迟插件,因此我想的是先来一波压测证明它各方面没问题再麻烦运维去装,这波测试果然发现了问题.
关于下面延迟插件概念性的解释和demo可以看我之前的博客
我们在第一次使用这个延迟插件的时候做了一个压测,压测结果显示大约100W数据量的延迟消息会导致内存和Cpu使用量的急速上升.可以想象如果大家开始几万测试消息用的很爽,然后直接上生产,几百W消息进来一下就把整个RabbitMQ搞挂掉了.
问题出在那里呢?
由于RabbitMQ是使用erlang语言开发的,源码确实看不懂,查了一些文档没搞明白后(实际上就没发现有人提到这些坑),去了官网看了下,这里总结下自己的发现
关于作者对于RabbitMQ延迟插件这个半成品的解释,大家可以看下面的链接
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/issues/72
延迟粒度是消息级别的,非常方便,在数据量比较小的情况下,使用它是没问题的,或者自己可以做一些额外的配合,尽量使其延时最近的数据,并且数据量维持到一个比较低的程度,这点的实现方式的话,我这里大概有一点自己思路,大家可以稍微参考下.
一定要擦亮自己的双眼啊,很多作者为了吸睛各种不负责任标题去吸引人,大家一定要
**自己验证,一定要基于自己生产的规模做必要的压测,比如拉去自己生产的流量高峰去做吞吐量压测或者并发压测**,最好处理能力达到自己生产的三倍以上,我这里也有个压测工具Jmeter的使用科普,大家可以看看