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

本篇文章给大家分享的是有关C#中怎么利用RabbitMQ实现一个延迟队列功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

成都创新互联主要从事网站设计、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务昆玉,十余年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792

一、 需求背景

当用户在商城上进行下单支付,我们假设如果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对应的交换器。

以上就是C#中怎么利用RabbitMQ实现一个延迟队列功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


文章名称:C#中怎么利用RabbitMQ实现一个延迟队列功能
文章地址:http://ybzwz.com/article/pjecpi.html