1

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

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

我应该如何处理以避免“丢失”消息?

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

4

1 回答 1

2

如果您有多个前端实例并且希望将 EasyNetQ 用作 SignalR 的“背板”,请确保每个实例的订阅者 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 时会出现类似的重载

于 2016-12-16T08:36:21.783 回答