当前位置: 首页 > news >正文

RabbitMQ怎么实现延时支付?

一、使用“死信队列”+消息过期时间

1、原理:

设置消息”存活时间“,如果没有被及时消费,就会被丢弃到一个”死信队列“,然后消费者监听这个死信队列处理消息

2、步骤:

        2.1、创建两个队列:

                2.1.1、普通队列:设置过期时间(30分钟),并指定过期后转到死信队列
                2.1.2、死信队列:消费者监听这里处理超时订单。

        2.2、用户下单,发送一条消息到普通队列,这条消息30分钟后自动过期,进入死信队列。

         args.put("x-dead-letter-exchange", "dead_exchange");

        2.3、消费者从死信队列拿到消息,检查支付状态,取消未支付订单

3、优缺点:

        3.1、优点:不用装插件,纯RabbitMQ自带功能

        3.2、缺点:如果消息还没过期就被消费了,可能会提前触发(需要保证普通队列没人消费)

二、用Rabbit MQ官方插件(延时消息插件)

1、原理:

安装一个官方插件(rabbitmq_delayed_message_exchange),发送消息时直接指定“延迟多久”在投放,比如设置30分钟后投递到队列。

2、步骤:

        2.1、安装插件,创建一个特殊类型的交换机(x-delayed-message类型)

        2.2、发送消息时带上参数:headers.put("x-delay",30*60*1000)。表示延时30分钟。

        2.3、消费者正常监听队列,30分钟后才会接收消息去处理

3、优缺点:

        3.1、优点:简单直接,消息精准延时。

        3.2、需要装插件,运维成本更高。    

问题:消息阻塞问题?

  1. 加消费者:最简单的办法,多开几个实例一起消费。

  2. 调预取值:控制每个消费者拿消息的数量,别让它“贪多嚼不烂”。

  3. 设队列上限:队列不能无限扩容,超过长度直接拒绝或丢旧消息。

  4. 设消息过期:没用的消息早点扔掉,比如超时未支付的订单。

  5. 死信队列兜底:过期或失败的消息统一转到一个队列处理。

  6. 监控告警:发现队列快满了,赶紧扩容或限流。

  7. 生产者限流:根据队列状态动态控制发送速度。

相关文章:

  • C++:内联函数
  • Linux常用指令
  • VirtualBox虚拟机安装Mac OS启动后的系统设置
  • 指纹细节提取(Matlab实现)
  • Java 大视界 -- Java 大数据在智能教育考试评估与学情分析中的应用(112)
  • RV1126的OSD模块和SDL_TTF结合输出H264文件
  • Elasticsearch简单学习
  • 电子电路中,正负双电源供电的需求原因
  • excel 斜向拆分单元格
  • 第51天:Web开发-JavaEE应用SpringBoot栈身份验证JWT令牌Security鉴权安全绕过
  • Webpack、Vite区别知多少?
  • 单片机学习规划
  • Java学习——day14
  • 成功解决 “\ufeffimport sys“ SyntaxError: invalid character in identifier
  • Node.js setImmediate 教程
  • Linux常见操作命令(1)
  • linux常见操作命令
  • 数列极限入门习题
  • FPGA学习(二)—— 三八译码器
  • unity学习62,尝试做一个flappy bird
  • “五一”假期首日国铁郑州局迎大客流,预计发送旅客逾95万人次
  • 滨江集团:一季度营收225.07亿元,净利润9.75亿元
  • 海量数据处于“原矿”状态,数据价值释放如何破局?
  • 中国银行副行长刘进任该行党委副书记
  • 法院为“外卖骑手”人身权益撑腰:依法认定实际投保人地位
  • 五一假期上海铁路预计发送446万人次,同比增长8.4%