如何实现RabbitMQ发布订阅模式多实例消费者避免重复消费?
摘要:上一篇文章中已经通过一个实际的业务场景结合RabbitMQ的四种交换机类型对RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费这个问题给出了解决方案。水这篇的目的主要是再给出一个可以直接抄作业的代码。
书接上回。
上一篇文章中已经通过一个实际的业务场景结合RabbitMQ的四种交换机类型对RabbitMQ发布订阅模式同一消费者多个实例如何防止重复消费这个问题给出了解决方案。结尾的时候挖了个坑,水这篇的目的就是要把这个坑填上,给大家提供一个可以直接抄作业的代码。
先把一些参数提前公布出来,后面代码里面再遇到就不逐个解释了
RabbitMQ主机地址127.0.0.1,如果是部署在其他机器上的,就把IP地址替换成相应的主机IP或者域名。
如果使用默认端口5672,连接地址可以不用写,映射到其他端口的话在主机地址上面加上。
采用默认的用户名和密码guest,根据具体情况进行相应替换。
预定交换机名称demo.event,根据具体情况进行相应替换。
预定队列名称demo.event.queue,根据具体情况进行相应替换。
队列demo.event.queue上有两个消费者,另外再生成一个只有一个消费者的随机名称队列。
要达到的效果
生产者发送一条消息到交换机demo.event,再由交换机分发到绑定给它的队列上,demo.event.queue队列上的消费者只有一个能收到,其他随机队列的消费者(只有一个)也能收到消息。
一、准备RabbitMQ环境
我是在docker上部署的,到官方网站下载Docker Desktop直接安装就可以了,这里不再赘述。RabbitMQ的环境准备不是本篇的重点,这里只提供最基本的用法,有其他需求可以略过这一章节,去RabbitMQ或者Docker官网按照文档配置即可。
拉取镜像
我用的是带管理后台的rabbitmq:management。
打开控制台/终端,输入
docker pull rabbitmq:management
创建Volumes
docker volume create rabbitmq
创建容器
docker run -d --name rabbitmq -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 -p 25672:25672 -p 15691:15691 -p 15692:15692 -v rabbitmq:/var/lib/rabbitmq rabbitmq:management
执行完以上代码后,容器会自动启动。
二、.net + RabbitMQ.Client
先准备IDE,Visual Studio、VS Code、Rider都可以。
我这里用的LinqPad,这是一个可以快速执行C#、VB、F#代码块和SQL的工具,使用Microsoft Roslyn进行编译,支持引入NuGet包和三方DLL文件,可以直接运行Asp.Net Core服务。Ver9开始支持macOS,渲染层由之前的WPF改成了AvaloniaUI。有需要的可以使用下面的链接购买
https://www.linqpad.net/Purchase.aspx?affiliate=8ucu28vs
1、依赖包
RabbitMQ.Client
LinqPad通过自带工具添加,正经IDE通过NuGet Manager、CLI工具添加或者在csproj引入
<PackageReference Include="RabbitMQ.Client" Version="7.2.0" />
如果项目使用集中版本管理,需要在Directory.Packages.props添加
<PackageVersion Include="RabbitMQ.Client" Version="7.2.0" />
然后在具体项目的csproj添加
<PackageReference Include="RabbitMQ.Client" />
需要注意的是,7.x以后RabbitMQ.Client做了比较大的调整,原先的方法都改成了异步,EventingBasicConsumer也换成了AsyncEventingBasicConsumer,Consumer的Receive事件变成了ReceivedAsync,支持异步事件处理。
