C#中怎么利用RabbitMQ实现一个延迟队列功能(rabbitmq,编程语言)

时间:2024-05-01 17:03:41 作者 : 石家庄SEO 分类 : 编程语言
  • TAG :

一、需求背景

当用户在商城上进行下单支付,我们假设如果8小时没有进行支付,那么就后台自动对该笔交易的状态修改为订单关闭取消,同时给用户发送一份邮件提醒。那么我们应用程序如何实现这样的需求场景呢?在之前的《C# Redis缓存过期实现延迟通知实战演练》分享课程中阿笨最后总结的时候说过Redis Pub/Sub是一种并不可靠地消息机制,他不会做信息的存储,只是在线转发,那么肯定也没有ack确认机制,另外只有订阅段监听时才会转发!我们是否有更好的方式去实现呢?今天给大家分享的比较好的解决方案就是通过RabbitMQ的TTL(time to live)和DLX(Dead-Letter-Exchange)来实现延迟任务。

1.1、本次分享课程适合人群如下:

1、有一定的NET开发基础并对RabbitMQ技术有一定了解和认识。

2、喜欢阿笨的干货分享课程的童鞋们。

1.2、一句话总结今天我们要学习的目标和成果?

C#如何通过RabbitMQ如何实现延迟队列功能。

如果您对本次《C#RabbitMQ延迟队列功能实战项目演练》分享课程感兴趣的话,那么请跟着阿笨一起学习吧。

废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。

二、场景介绍

2.1、什么是延迟队列?

延迟队列存储的对象肯定是对应的延时消息,所谓”延时消息”是指当消息被发送以后,并不想让消费者立即拿到消息,而是等待指定时间后,消费者才拿到这个消息进行消费。

2.2、使用RabbitMQ实现延迟任务应用场景如下:

场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时。

场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单。

阿笨个人理解延迟队列主要两类应用场景:“被动延迟”业务场景和“主动延迟”业务场景。

三、思路讲解

3.1、实现思路

生产者输出消息到Queue1,并且这个消息是设置有有效时间的,比如60s。消息会在Queue1中等待60s,如果没有消费者收掉的话,它就是被转发到Queue2,Queue2有消费者,收到,处理延迟任务。

C#中怎么利用RabbitMQ实现一个延迟队列功能

RabbitMQ延时队列实现原理图

3.2、实现方案

方案一:在rabbitmq 3.5.7及以上的版本提供了一个插件(rabbitmq-delayed-message-exchange)来实现延迟队列功能。同时插件依赖Erlang/OPT 18.0及以上。

方案二:通过RabbitMQ的Time To Live(TTL)和Dead Letter Exchanges(DLX)两个特性来曲线实现延迟队列。

实现方案分为两种,这里阿笨推荐方案二!

四、实现步骤

1)、基于队列方式实现延迟队列(消息队列中所有消息的过期TTL一样)

通过队列属性设置,队列中所有消息都有相同的过期时间。

2)、基于消息方式实现延迟队列(消息队列中单个消息的过期TTL不一样)

对消息进行单独设置,每条消息TTL可以不同。

五、课后思考与总结

5.1、思考与总结

需求:用户在系统中创建一个订单,如果10s后,用户没有进行支付,那么自动取消订单。

分析:

1、上面这个情况,我们就适合使用延时队列来实现,那么延时队列如何创建

2、延时队列可以由 过期消息+死信队列 来时间

3、过期消息通过队列中设置 x-message-ttl 参数实现

4、死信队列通过在队列申明时,给队列设置 x-dead-letter-exchange 参数,然后另外申明一个队列绑定x-dead-letter-exchange对应的交换器。

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:C#中怎么利用RabbitMQ实现一个延迟队列功能的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:.NET分布式缓存Memcached如何从入门到实战下一篇:

2 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18