到此 灵熙云工作室 - 实践出真理 查看全文内容
应用场景
目前常见的应用软件都有消息的延迟推送的影子,应用也极为广泛,例如:
- 淘宝七天自动确认收货。在签收商品后,物流系统会在七天后延时发送一个消息给支付系统,通知支付系统将款打给商家,这个过程持续七天,就是使用了消息中间件的延迟推送功能。
- 12306 购票支付确认页面。在选好票点击确定跳转的页面中往往都会有倒计时,代表着 30分钟内订单不确认的话将会自动取消订单。其实在下订单那一刻开始购票业务系统就会发送一个延时消息给订单系统,延时30分钟,告诉订单系统订单未完成,如果我们在30分钟内完成了订单,则可以通过逻辑代码判断来忽略掉收到的消息。
在上面两种场景中,如果使用下面两种传统解决方案无疑大大降低了系统的整体性能和吞吐量:
- 使用 redis 给订单设置过期时间,最后通过判断 redis中是否还有该订单来决定订单是否已经完成。这种解决方案相较于消息的延迟推送性能较低,因为我们知道redis都是存储于内存中,我们遇到恶意下单或者刷单的将会给内存带来巨大压力。
- 使用传统的数据库轮询来判断数据库表中订单的状态,这无疑增加了IO次数,性能极低。
- 使用 jvm 原生的 DelayQueue,也是大量占用内存,而且没有持久化策略,系统宕机或者重启都会丢失订单信息。
之前一般采用死信队列+TTL过期时间来实现延迟队列,现在RabbitMQ 官方提供了延迟队列的插件,这个插件是实验性的,但相当稳定,废话不多说开整
插件安装
此插件需要 Erlang 23.2 或更高版本。Erlang windows下载
最新版本针对 RabbitMQ3.8.x,较早的系列已不受支持。RabbitMQ下载
插件下载放置到 RabbitMQ 根目录下的 plugins 内。延迟队列插件下载
进入RabbitMQ安装目录的sbin目录下,在cmd窗口使用命令启用延迟插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
禁用插件,使用如下命令,但请注意,所有尚未交付的延迟消息都将丢失 。
rabbitmq-plugins disable rabbitmq_delayed_message_exchange
注:本demo在windows环境下模拟,插件采用rabbitmq-delayed-message-exchange v3.8.x版本;插件启用或禁用时,若Rabbitmq服务一直是启用状态的话,需重启使其生效
|