C# 在.NET应用程序中检测和处理无响应的RabbitMQ

C# 在.NET应用程序中检测和处理无响应的RabbitMQ,c#,mono,rabbitmq,masstransit,C#,Mono,Rabbitmq,Masstransit,我们最近发生了一次停机,其中一个API由于rabbit集群被人为地赋予高负载而变得无响应。我们发现mono(.NET)中的线程不足,对API的请求失败。虽然这种情况不太可能再次发生,但我们希望对此采取一些保护措施。理想情况下,我们会在设定的时间量之后调用bus.Publish()timeout,但我们无法确定如何执行 然后,我们遇到了RabbitMQ的阻塞连接通知功能,并认为这可能会有所帮助。但是,我们无法找到如何获取IServiceBus中的连接对象。到目前为止,我们已经试过了 _servic

我们最近发生了一次停机,其中一个API由于rabbit集群被人为地赋予高负载而变得无响应。我们发现mono(.NET)中的线程不足,对API的请求失败。虽然这种情况不太可能再次发生,但我们希望对此采取一些保护措施。理想情况下,我们会在设定的时间量之后调用bus.Publish()timeout,但我们无法确定如何执行

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

_serviceBus = serviceBus;
        var connection =
            ((MassTransit.Transports.RabbitMq.RabbitMqEndpointAddress) _serviceBus.Endpoint.Address)
                .ConnectionFactory.CreateConnection();  
        connection.ConnectionBlocked += Connection_ConnectionBlocked;
        connection.ConnectionUnblocked += Connection_ConnectionUnblocked;
但当我们这样做时,我们会得到一个BrokerRunreachable异常,我不理解


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

我认为您可以通过结合
System.Timer
Observable.Timer
来安排检查和检查,它们使用请求-响应。请求的使用者应位于同一进程内。您可以为
请求
呼叫指定一个具有合理超时的取消令牌,如果您得到超时-您的消息传递基础结构已关闭或太忙,或者您的端点太忙。

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