【问题标题】:Detect and handle unresponsive RabbitMQ in .NET application在 .NET 应用程序中检测和处理无响应的 RabbitMQ
【发布时间】:2023-03-08 14:07:01
【问题描述】:

我们最近发生了一次中断,由于我们的兔子集群被人为地赋予了高负载,我们的一个 API 变得无响应。我们在单声道(.NET)中用尽线程并且对 API 的请求失败。尽管这种情况不太可能再次发生,但我们希望对此进行一些保护。理想情况下,我们会在一段时间后调用 bus.Publish() 超时,但我们无法确定如何进行。

然后我们遇到了 RabbitMQ 的阻塞连接通知功能,并认为这可能会有所帮助。但是,我们无法弄清楚如何获取 IServiceBus 中的连接对象。到目前为止,我们已经尝试过

_serviceBus = serviceBus;
        var connection =
            ((MassTransit.Transports.RabbitMq.RabbitMqEndpointAddress) _serviceBus.Endpoint.Address)
                .ConnectionFactory.CreateConnection();  
        connection.ConnectionBlocked += Connection_ConnectionBlocked;
        connection.ConnectionUnblocked += Connection_ConnectionUnblocked;

但是当我们这样做时,我们会得到一个我不明白的 BrokerUnreachableException。

我的问题是,这是检测超时和失败的正确方法吗(我们有一个备份机制来收集消息中的数据并稍后重新发布),如果正确,我们如何使其工作?

【问题讨论】:

  • 我们有一项服务,所有其他服务都向其中发送注册消息,然后每分钟使用 saga 进行 ping 操作。如果没有响应,无论出于何种原因,我们都会将服务状态设置为“关闭”,并向应该查看的人发送一封电子邮件。这解决了许多问题,包括您描述的问题。

标签: c# mono rabbitmq masstransit


【解决方案1】:

我认为您可以通过组合 System.TimerObservable.Timer 来安排检查以及使用请求-响应的检查来管理此问题。请求的消费者应该在同一个进程中。您可以为 Request 调用指定一个具有合理超时的取消令牌,如果您收到超时 - 您的消息传递基础架构已关闭或太忙,或者您的端点太忙。

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多