【问题标题】:Message is still processed even after client request timeout in MassTransit即使在 MassTransit 中的客户端请求超时后,仍然会处理消息
【发布时间】:2021-03-05 02:56:22
【问题描述】:

我正在使用 MT 和 RabbitMQ 实现标准请求/响应方案。客户端是 Asp.net 核心 API,消费者是 Windows 服务。

如果我停止消费者并使用请求客户端从 API 提交请求,作为测试异常情况的一部分,由于没有消费者处理,API 得到请求超时异常,这很酷。但是消息位于消费者队列中,当我启动消费者时,它会选择消息并处理内容(将消息发送到外部端点)并移动到 _skipped 队列,因为没有请求客户端侦听此消息。

你认为这是正确的行为吗?第一名,当api出现请求超时异常时,无论如何他都会重试,那么处理第一条消息还有什么意义呢?

我如何忽略那些请求客户端已经完成处理并出现任何错误的消息?

谢谢

【问题讨论】:

    标签: rabbitmq masstransit


    【解决方案1】:

    您所描述的内容非常普遍,我建议您阅读idempotence 和其他分布式系统故障场景。

    在基于消息的系统中发送命令(在这种情况下是请求)和通过超时来传达结果可能会非常具有误导性。例如,如果您查看ForkJoint,在请求超时的情况下,响应实际上是202/Accepted,而不是传达错误。

    消息在队列中,它将被处理,因此没有理由让控制器失败并向调用者报告错误。因此使用了中间响应。

    该示例是MassTransit Season 3 的一部分,我在其中讨论了一个新的习惯用法,用于处理分布式系统中命令的最终完成/失败。里面可能有一些有用的例子可以帮助你理解失败的场景。

    【讨论】:

      【解决方案2】:

      正如doc 所说,丢弃跳过的消息,这样它们就不会移动到_skipped 队列中:

      cfg.ReceiveEndpoint("input-queue", ec =>
      {
          ec.DiscardSkippedMessages();
      });
      

      【讨论】:

        猜你喜欢
        • 2017-07-10
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        • 2012-11-21
        相关资源
        最近更新 更多