4K字详解RabbitMQ延迟消息指南「.NET6+EasyNetQ」

本文介绍了如何在RabbitMQ中实现特定类型消息的延迟消费。通过设置死信交换机策略和使用rabbitmq_delayed_message_exchange插件,分别展示了两种延迟消费的方法。在不依赖额外框架的情况下,确保只有首次消费时才延迟1小时,且消费者可能重启的情况也能正确处理。
摘要由CSDN通过智能技术生成

背景

最近遇到一个比较特殊需求,需要修改一个的RabbitMQ消费者,以实现在消费某种特定的类型消息时,延迟1小时再处理,几个需要注意的点:

  • 延迟是以小时为单位
  • 不是所有消息都延迟消费,只延迟特定类型的消息
  • 只在第一次消费时延迟1小时,容错机制产生的重新消费(也即消息消费失败,多次进入延迟队列重试),则不再延迟1小时
  • 消费者消费过程中可能会重启

考虑到这几点,我们需要一个标识以及持久化,不能简单使用Thread.Sleep或者Task.Delay;下面开始演示在不引入其它框架资源的前提下,利用现有的RabbitMQ来实现这个需求。

准备

如果没有可用的RabbitMQ测试环境,推荐使用docker本地搭建

docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management

项目搭建

创建解决方案RabbitMQDemo, 并添加一个.Net6控制台程序Producer作为生产者,

mkdir RabbitMQDemocd RabbitMQDemo dotnet new sln -n RabbitMQDemo mkdir srccd srcdotnet new console -n Producer cd Producerdotnet add package EasyNetQ  -s https://api.nuget.org/v3/index.json dotnet add package Newtonsoft.Json  -s https://api.nuget.org/v3/index.json  cd ../..dotnet sln add ./src/Producer/Producer.csproj

我们给Producer项目添加了两个包 ——EasyNetQ是用来简便RabbitMQ操作,添加Newtonsoft.Json则是因为EasyNetQ从v7版本开始移除了对前者的依赖,需要使用者自行添加。

接下来定义消息的数据结构,添加一个类库Core到解决方案,

cd srcdotnet new classlib --name Core cd ..dotnet sln add ./src/Core/Core.csproj

添加如下OrderNotification类,后面我们根据消息的 Type的值来确定是正常消费还是延迟消费。

namespace Core{    public class OrderNotification    {        public string OrderId { get; set; }        public int Type { get; set; }        public DateTime DateCreation { get; set; }    }}

生产者

在Producer项目里,声明队列orders.notification,绑定到同名交换机,然后向该交换机发送OrderNotification类型的数据,

实际项目中,我们很少直接发消息到队列,都是发送到交换机,这个项目虽然只是demo,但也遵循这个原则

完整代码如下:

using Core; using EasyNetQ;using EasyNetQ.Topology; var bus = RabbitHutch.CreateBus("host=localhost;port=5672;virtualHost=/;username=guest;password=guest;requestedHeartbeat=10");//声明交换机var sourceExchange = await bus.Advanced.ExchangeDeclareAsync(name: "orders.notification", ExchangeType.Direct);//声明队列var sourceQueue = await bus.Advanced.QueueDeclareAsync(name: "orders.notification");//绑定await bus.Advanced.BindAsync(sourceExchange, sourceQueue, ""); Console.WriteLine("按Ctrl +
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值