【问题标题】:MassTransit compensation failure - deadletter?大众运输补偿失败 - 死信?
【发布时间】:2018-03-10 10:31:57
【问题描述】:

我是 MassTransit 的新手(使用 rabbitmq),所以如果这是一个愚蠢的问题,请原谅我。

我只是想知道如何处理不成功的赔偿?所以所有重试都失败了,即没有补偿成功 - 我想消息应该进入一个死信队列,让我在以后手动重试一次,然后再试一次?

任何帮助将不胜感激。

【问题讨论】:

    标签: rabbitmq masstransit


    【解决方案1】:

    如果您正在使用路由清单,并且在补偿活动期间引发异常,则会发布 RoutingSlipCompensationFailed 事件。此时,没有重试,没有错误/死信等。路由单在该点被认为“结束”,并且出错的分布式事务(从而导致调用补偿方法)结束。

    使用路由单时,观察路由单运行时产生的事件(活动完成/补偿/故障,以及整体路由单完成/故障/补偿失败)非常重要 - 通常使用 saga。

    我建议查看我的 GitHub 上的 Demo-Registration 示例,以了解如何结合使用 sagas 和路由单来执行可靠的分布式事务。

    https://github.com/phatboyg/Demo-Registration

    【讨论】:

    • 我看到 Compensate() 被无限期调用,如果我尝试在 catch all 异常块中捕获并返回 context.Failed(myException) 。这是预期的吗?
    • 如果 try 块总是失败,我的上述观察就会发生。消息似乎被无限期回滚。
    • 更新:我上面的评论适用于4.0.1。升级到 5.1.5 后,它就像 Chris 提到的那样工作。
    【解决方案2】:

    如果重试策略无法帮助处理邮件并且未配置重新传递(二级重试),则邮件将进入有害队列。毒物队列在 MassTransit 中称为“错误队列”。

    毒物队列与您的接收端点队列具有相同的队列名称,带有_error 后缀。

    Deadletter 是另一回事,它用于端点接收到但端点不知道如何处理的消息。死信队列在 MassTransit 中称为“跳过的消息队列”,后缀为 _skipped

    更新:这是通用的 MassTransit 行为。正如克里斯在另一个答案中所述,Courier 的工作方式不同。我不清楚问题是关于使用路由单。

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 2011-07-04
      • 2012-02-15
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多