【问题标题】:Multiple subscribers easymq多个订阅者 easymq
【发布时间】:2016-12-15 21:07:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net rabbitmq signalr event-bus easynetq


    【解决方案1】:

    如果您有多个前端实例并且希望将 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 时也会出现类似的重载

    【讨论】:

    • 有趣。也许我会使用某种特定于机器的 id。关于 TTL,您将如何使用 EasyNetQ 进行设置?结果会是什么?队列会在空闲一段时间后被移除还是会在 5 分钟后自动移除?我将如何在我的应用程序中处理它?
    • 添加了一个示例,希望对您有所帮助
    • 只是为了添加另一个选项,如果应用程序使用IBus 的单个实例来订阅主题(我想很可能应该是这种情况),那么您可以在以下情况下使用新的 GUID订阅,连同上述队列的短 TTL。我已经成功实施了类似的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2011-01-28
    • 2017-11-27
    • 1970-01-01
    相关资源
    最近更新 更多