如何配置 MassTransit 在失败时重试 context.Publish()?
How to configure MassTransit to retry context.Publish() in case of failure?
如何配置 MassTransit 在失败前重试 context.Publish()
,例如当 RabbitMQ 服务器暂时不可用时?
在此上下文中重试的问题是 Publish
调用失败的唯一真正原因是代理连接丢失(出于任何原因:网络等)。
在这种情况下,用于接收消息的连接也会丢失,这意味着连接到代理的另一个节点可能已经接收到消息。所以在这种情况下重试会很糟糕,因为它会重新连接到代理并发送,但随后无法确认消息(因为它可能在另一个 thread/worker 上被接收)。
这里通常的做法是让它失败,当接收端点重新连接时,消息将重新传递给消费者,消费者随后调用 Publish
并达到预期的结果。
您应确保您的消费者能够正确处理此问题(搜索 idempotent)以避免导致业务逻辑中断的故障。
2022 年 1 月更新:从 v7 开始,MassTransit 会重试所有 publish/send 调用,直到 cancellationToken 被取消。
如何配置 MassTransit 在失败前重试 context.Publish()
,例如当 RabbitMQ 服务器暂时不可用时?
在此上下文中重试的问题是 Publish
调用失败的唯一真正原因是代理连接丢失(出于任何原因:网络等)。
在这种情况下,用于接收消息的连接也会丢失,这意味着连接到代理的另一个节点可能已经接收到消息。所以在这种情况下重试会很糟糕,因为它会重新连接到代理并发送,但随后无法确认消息(因为它可能在另一个 thread/worker 上被接收)。
这里通常的做法是让它失败,当接收端点重新连接时,消息将重新传递给消费者,消费者随后调用 Publish
并达到预期的结果。
您应确保您的消费者能够正确处理此问题(搜索 idempotent)以避免导致业务逻辑中断的故障。