由于tcp背压(流量控制),我还没有找到确定发布者何时挂起的方法。对于我的应用程序,挂起任何线程都是非常不可接受的。如果没有快速发生,我需要能够中止发布操作。我注意到Pika客户端有一个回调,但在c#客户端文档中找不到任何内容。有人有解决方案吗?我可以创建一个后台任务来进行发布,并在一些超时后中止线程,但这似乎很重要,而thread.abort有它自己的问题。
答案 0 :(得分:4)
RabbitMQ从显式流控制切换到通过TCP反压进行限制的原因是支持更多客户端(其中许多客户端无法处理channel.flow
等异步方法)。不幸的是,它的完成方式,以及可以说应该如何完成的方式,对于发布者来说是完全透明的 - 发布者无法判断它何时受到限制。
如果你真的有一个硬实时保证发布,你唯一的选择是实现手动超时。当然,这并没有解决RabbitMQ过载的根本问题,因此停止发布,终止连接并打开新连接将不会让您更接近再次发布。
所以,您要么1)需要修改为什么需要这样严格的发布保证,或者2)向RabbitMQ cluster添加更多节点(这很简单并且旨在改善这种情况)。 / p>