关于RabbitMQ实现延迟消息之大家避而不谈的坑望周知

2021-09-17  本文已影响0人  名字是乱打的

一. 背景

我之前在做延迟消息的时候做了很多的尝试,也摒弃了很多的方案,其中就有RabbitMQ死信队列和延迟插件的使用,其实他们都有比较严重的局限性,但是这两天我在看博客时候发现呢,很多文章或者公众号大肆宣扬它的功能点,丝毫不提它的坑,甚至夸大其词说啥"拼多多百亿消息的实现",我觉得这样真的不太好,很容易误导别人,写扫盲文章点出来它的优点和缺点最好.滥用不研究很容易出现生产问题

二. 我现在描述下自己调查基于RabbitMQ两种方式实现延迟消息的局限性

2.1死信队列局限性

我们基于TTL和死信队列(概念性的解释和demo可以看我之前的博客)做到延迟消息的局限性在于,延迟粒度是在队列级别的,我们需要对队列设置固定的TTL,然后每个消息在进入队列时候拥有统一的初始化消息消亡时间,如果我们想要做到延迟时间随机必须要做到创建很多很多很多不同TTL的延迟队列.

2.2基于RabbitMQ延迟插件的局限性

由于运维那边没有预装RabbitMQ延迟插件,因此我想的是先来一波压测证明它各方面没问题再麻烦运维去装,这波测试果然发现了问题.
关于下面延迟插件概念性的解释和demo可以看我之前的博客

2.2.1 我这里反过来,先说下缺点

我们在第一次使用这个延迟插件的时候做了一个压测,压测结果显示大约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

2.2.2 优点

延迟粒度是消息级别的,非常方便,在数据量比较小的情况下,使用它是没问题的,或者自己可以做一些额外的配合,尽量使其延时最近的数据,并且数据量维持到一个比较低的程度,这点的实现方式的话,我这里大概有一点自己思路,大家可以稍微参考下.

三. 一点小建议

一定要擦亮自己的双眼啊,很多作者为了吸睛各种不负责任标题去吸引人,大家一定要自己验证,一定要基于自己生产的规模做必要的压测,比如拉去自己生产的流量高峰去做吞吐量压测或者并发压测,最好处理能力达到自己生产的三倍以上,我这里也有个压测工具Jmeter的使用科普,大家可以看看

上一篇 下一篇

猜你喜欢

热点阅读