【问题标题】:C# Masstransit how to handle exception when the queue is not available or down当队列不可用或关闭时,C# Masstransit 如何处理异常
【发布时间】:2016-09-15 10:14:59
【问题描述】:

我正在使用带有 RabbitMQ 的 Masstransit 来使用队列中的消息。谁能告诉我当队列关闭或无法获取消息时如何处理异常?以下是我的设置:

    var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
    {
        var host = cfg.Host(new Uri(configManager.RabbitMqUrl), h =>
        {
            h.Username(configManager.RabbitMqUserName);
            h.Password(configManager.RabbitMqPassword);
        });

        cfg.ReceiveEndpoint(host, RabbitMqConstants.Change, e =>
        {
            e.UseRetry(Retry.Immediate(configManager.ProcessorRetryNumber));
            e.Handler<ChangeDetected>(context =>
            {
                var task = Task.Run(() => consumer.Consume(context));
                return task;
            });
        });
    });

谢谢

【问题讨论】:

    标签: c#-4.0 rabbitmq masstransit


    【解决方案1】:

    在我们内部的 RabbitMQ 消息传递实施中,我们通过两种方式接近/解决了此问题的发布方面(想要发布时代理不可用):

    [1] 我们使用Polly 异步编排有限数量的发布重试(尝试之间有延迟)。这克服了与代理的连接丢失是轻微网络故障的情况。

    [2] 如果所有发布重试都失败,我们使用“消息医院”概念:我们将有关发布失败消息的足够详细信息存储到备用源(数据库;附加故障转移到本地文件存储),例如如果需要,我们可以稍后重新发布失败的消息。 “存储转发”的变体(我们可以批量重新发布,但我们也允许人工干预来选择是否重新发布)。

    一切都取决于“永不丢失消息”对您的重要性。 RabbitMQ 代理的一些冗余(如 Chris Patterson 建议的集群或联合)也是一个明显的步骤。如果您丢失/想要对您的一个/一些代理进行维护,集群/联合可为您提供保护。如果由于某种原因消息发布者无法看到 任何 RabbitMQ 代理(例如,发布者附近的网络故障),上述弹性策略 [1]、[2] 可为您提供保护。

    【讨论】:

      【解决方案2】:

      为了接收消息,MassTransit 将在重新联机时自动重新连接到代理 (RabbitMQ)。对于发送消息,如果您的应用程序无法连接到代理发送,那完全是另一个问题。

      在应用程序中使用消息传递时,它通常成为基础架构中最重要的一个方面。因此,如果您需要高可用性,那么您将来可能会设置集群(那里有关于集群 RabbitMQ 的文章)。

      MassTransit 中没有任何存储转发概念,需要提供代理。虽然已经讨论了一些选项,但目前还没有具体的选项,也没有普遍可用的选项。

      【讨论】:

      • 感谢您的澄清。但是如果代理宕机了,我怎么能强制 Publish 方法抛出异常呢?
      【解决方案3】:

      在阅读了它的文档后,我意识到 MassTransit 只是不处理生产者未能向 MQ 发送/发布或消费者未能发送回 ACK 的情况。

      所以我不得不使用另一个工具CAP,它实现了一个本地事务表。您可以将发送消息操作放在业务代码的同一本地数据库事务中。但缺点是 CAP 还没有实现 saga。

      否则,您必须自己实现与本地事务表的持久发件箱模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 2013-09-10
        • 1970-01-01
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多