如何配置 MassTransit 在失败时重试 context.Publish()?

Edg*_*oks 3 c# masstransit

如何配置 MassTransitcontext.Publish()在失败之前重试,例如当 RabbitMQ 服务器暂时不可用时?

Chr*_*son 7

在这种情况下重试的问题是,调用失败的唯一真正原因Publish是代理连接丢失(由于任何原因:网络等)。

在这种情况下,用于接收消息的连接也会丢失,这意味着连接到代理的另一个节点可能已经获取了该消息。因此,在这种情况下重试会很糟糕,因为它会重新连接到代理并发送,但随后消息无法被确认(因为它可能是在另一个线程/工作线程上拾取的)。

这里通常的操作过程是让它失败,当接收端点重新连接时,消息将被重新传递给消费者,然后消费者将调用Publish并达到所需的结果。

您应该确保您的消费者可以正确处理此问题(搜索幂等),以避免失败导致业务逻辑中断。

2022 年 1 月更新:自 v7 起,MassTransit 会重试所有发布/发送调用,直到取消令牌被取消。