多个订阅者 easymq

Multiple subscribers easymq

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

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

我应该如何处理此问题以避免收到 "loosing" 消息?

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

如果您有多个前端实例并且想要将 EasyNetQ 用作 SignalR 的 'backplane',请确保订阅者 ID(=队列名称)对于每个实例都是唯一的。

对于负载平衡的 IIS 服务器,您可以包括机器名称,或者如果您真的想错过最少数量的消息,您可以包括进程 ID。 (对于 IIS,同一个 AppPool 可以有多个进程处于活动状态,例如在回收期间)。

我总是将队列的 TTL 设置为大约 5 分钟,这样您就不会得到孤立的队列。

您可以通过在订阅上指定 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 时会出现类似的过载