我有一个使用EasyNetQ的.NET应用程序来监听从另一个应用程序发布的事件。该应用程序使用SignalR将收到的事件发布到仪表板。
我正在使用章鱼部署来部署我的应用程序,问题是每次部署新版本的应用程序时,我都会停止接收在总线上发布的所有消息(似乎我得到了一些但不是全部)。我已经阅读过有多个具有相同ID的订阅者,我猜这是问题所在。
我应该如何处理这个以避免"失去"消息?
如何运行同一个应用程序的不同实例(例如,几个开发人员针对相同的Rabbit mq实例工作)以及所有接收所有消息的客户端?
答案 0 :(得分:1)
如果您有多个前端实例并且想要将EasyNetQ用作SignalR的“背板”,请确保订户ID(=队列名称)对于每个实例都是唯一的。
对于负载均衡的IIS服务器,您可以例如包含计算机名称,或者如果您确实想要错过最少量的消息,则可以包括进程ID。 (对于IIS,可以在同一个AppPool中激活多个进程,例如在回收期间)。
我总是在5分钟左右设置队列的TTL,所以你不会得到孤立的队列。
您可以通过在订阅上指定WithExpires来设置队列的TTL,如下所示:
var subscriptionId = $"{Environment.MachineName}[{Process.GetCurrentProcess().Id}]-mymessage";
Bus.Subscribe<MyMessage>
(
subscriptionId,
message => Console.WriteLine(message.ToString()),
subscriptionConfig => subscriptionConfig
.WithExpires((int)5.Minutes().TotalMilliseconds)
);
使用AutoSubscriber时出现类似的重载