澄清 Azure 服务总线订阅中的 MassTransit 故障处理

问题描述 投票:0回答:1

我只是想澄清我对 MassTransit 在消费者在 subscriptionEndpoint 内抛出异常的情况下如何表现的理解,我相信这就是过程:

  • 消息被传递到主题并流入其每个订阅
  • MassTransit 从代理获取消息的锁并运行消费方法
  • 消费者抛出异常
  • 如果消费者定义配置了重试策略,MassTransit 会在内存中重试
  • 最终抛出异常并引发故障
  • 此故障消息已移至错误队列。
  • 订阅消息也会移动到该订阅的死信队列中

我最不清楚的是最后一点。消息是否被标记为已使用并从代理中删除,或者是否算作故障,以便我们在 Azure 主题订阅的 DLQ 和错误队列中拥有一条消息?

如果最终确实出现死信,MassTransit 是否明确将其标记为死信,以便 Azure 服务总线不会尝试重试向消费者交付(例如,如果订阅的重试计数为 10)?

提前致谢

masstransit
1个回答
0
投票

此故障消息已移至错误队列。

这是不正确的,订阅端点没有错误队列。仅使用 Azure 服务总线 DLQ。是的,一旦重试次数用完,该消息就会被发送到订阅的 DLQ 中。

如果使用者进程崩溃,消息将通过 Azure 服务总线重新传送到 MassTransit,最多达到 MaxDeliveryCount(默认为 10)。一旦达到最大传递计数(假设进程每次都会崩溃),ASB 会将消息移动到订阅的 DLQ。

当 MassTransit 将消息移动到 DLQ 时,它会添加描述发生的异常、过程等的标头。ASB 不会添加任何内容。

MassTransit 仅在消费者无一例外地成功消费消息后才会确认该消息,然后允许 ASB 将其从队列中删除。

您没有询问的一个额外说明是,消息重新传递不适用于订阅,因为它们不可寻址。如果 Azure 添加了延迟重新投递功能(基本上是更改消息的可见性以延迟投递),那么 MassTransit 将在 SDK 中提供后立即支持它。

© www.soinside.com 2019 - 2024. All rights reserved.