Spring Cloud 微服务项目实战
姚秋辰(姚半仙)
PayPal 研发经理
15862 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
结束语 (1讲)
Spring Cloud 微服务项目实战
15
15
1.0x
00:00/00:00
登录|注册

31 | 消息驱动:如何通过 RabbitMQ 插件实现延迟消息?

你好,我是姚秋辰。
在平时网购的时候,你一定有过下单之后忘记付款的情况,等到再回过头想起要付款,发现订单已经被关闭了,很多网购流程里都有类似的“订单超时关闭”功能。相类似的功能还有“自动确认收货”,如果在一定时间内买家都没有点击确认收货按钮,那么系统会自动确认收货并且将订单款项打给卖家。
我举的这两个例子都有一个共同的特征,那就是业务逻辑会预设在未来的某一个时间点被触发。在早期我们经常会使用 TTL+ 死信队列的方式来实现这种定时事件,通过设置一个正常的消息队列并使用 TTL 指定超时时间,如果队列中的消息超时了,它就会被 DLX(死信交换机)转向死信队列。借助这种曲线救国的方式,你就可以通过 MQ 组件实现“定时消息”。
相比于 TTL+DLX,RabbitMQ 提供了一种更为优雅的方式来实现这类业务。在这节课中,我将带你使用 RabbitMQ 的延迟消息插件,实现延迟发放优惠券的场景。
那么首先,我们先来安装这个延迟消息插件吧。

安装插件

你需要先打开 RabbitMQ 官网并进入到插件下载页面,在页面中定位到 rabbitmq_delayed_message_exchange 这个插件。
点击插件上的“Releases”链接,你可以看到适配不同 RabbitMQ 版本的延迟消息插件。我本地安装的的 RabbitMQ 版本是 3.9.8,最新的延迟消息插件的版本是 3.9.0,它可以适配 3.9.X 系列的 RMQ 组件,所以我建议你下载 3.9.0 版本对应的 rabbitmq_delayed_message_exchange-3.9.0.ez 安装包。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

RabbitMQ插件实现延迟消息,通过延迟消息插件实现了优惠券的延迟发放。文章首先介绍了安装插件的步骤,然后详细讲解了如何创建生产者和消费者来对接延迟消息队列。在实现延迟领券的过程中,通过MessageBuilder构建消息对象,设置了特殊的header x-delay,代表消息在队列中延迟处理的时间。接着,对消费者和配置文件做了相应的声明和修改。最后,总结了利用RabbitMQ搭建延迟消息的过程,并分享了在使用RabbitMQ实现高并发业务场景时的经验和思考。同时,提出了思考题,鼓励读者深入了解RabbitMQ提供的各种强大插件功能。整体而言,本文通过实际案例详细介绍了如何利用RabbitMQ插件实现延迟消息,对读者了解RabbitMQ延迟消息功能具有指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring Cloud 微服务项目实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 招谁惹谁
    延时消息能取消吗?如果不能取消,业务上还要对超时的已付款的订单再兼容呀。这个是不是定时任务更好一些!

    作者回复: 定时任务可以,不过时效性不如延迟消息好。每时没秒都有业务要处理,那定时任务要跑的像脱缰野狗一样频繁才行

    2022-03-03
    2
    3
  • 奔跑的蚂蚁
    在电商中 会遇到 下单 -》支付 -》退款 消息的发送点不一样 ,消费点也不一样 怎么保证这个消费成功的顺序呢

    作者回复: 如果可达性不能保证,就用外部事务表控制幂等性。而且下单 -> 支付 -> 退款之间是串行,下单失败是不会生成支付连接的,如果资金链路auth阶段失败就在payment gateway这一层(比如网联)原路返回,不会生成成功交易记录;如果交易capture成功,通常上游支付链路就直接触发callback url了,这时你再背后在发送支付成功的event,在本地消费成功event或补偿job查询到交易底层状态前,不会触发退款。

    2022-03-02
    1
  • inrtyx
    除了mq还有其他方式推荐吗?

    作者回复: 如果已经有了六脉神剑剑谱,为何还用学一阳指呢?

    2022-02-28
  • 小飞同学
    上家公司就遇到过实现任意延时时长消息问题,rabbitmq_delayed_message_exchange这个插件官方说的是有可能适合于生产使用(是性能还是稳定性的考虑、还是出于商业考虑)。为什么官方rabbitmq不推出新特性做支持,而要采用插件? 目前已知rocketmq只支持队列级别消息,好像也没有进一步去开发任意延时市场消息的趋势,也是为了商业化么?

    作者回复: 很多公司的开源版和商用版功能有一些差别,比如这里提到的rocketmq(阿里前身的metaq),阿里系的惯用手法哈,你看它的sentinel也是的,开源版有些功能甚至要自己修改底层代码,但是商用版做到alicloud里的就相对完善

    2022-02-28
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部