多个订户easymq

时间:2016-12-15 21:07:24

标签: .net rabbitmq signalr event-bus easynetq

我有一个使用EasyNetQ的.NET应用程序来监听从另一个应用程序发布的事件。该应用程序使用SignalR将收到的事件发布到仪表板。

我正在使用章鱼部署来部署我的应用程序,问题是每次部署新版本的应用程序时,我都会停止接收在总线上发布的所有消息(似乎我得到了一些但不是全部)。我已经阅读过有多个具有相同ID的订阅者,我猜这是问题所在。

我应该如何处理这个以避免"失去"消息?

如何运行同一个应用程序的不同实例(例如,几个开发人员针对相同的Rabbit mq实例工作)以及所有接收所有消息的客户端?

1 个答案:

答案 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时出现类似的重载