Symfony Messenger:重试延迟不适用于 Redis 传输

Posted

技术标签:

【中文标题】Symfony Messenger:重试延迟不适用于 Redis 传输【英文标题】:Symfony Messenger: retry delay not working with Redis transport 【发布时间】:2020-06-27 22:28:03 【问题描述】:

我有一个 Symfony 4 应用程序,它使用 Symfony Messenger 组件(版本 4.3.2)来发送消息。 对于异步消息处理,配置了一些 Redis 传输并且它们工作正常。但是后来我决定当消息处理失败时,其中一个应该重试几次。我配置了retry strategy,传输实际上开始重试失败,但它似乎忽略了延迟配置(键delaymultipliermax_delay)并且所有重试尝试总是毫无延迟地进行,所有在一秒或类似的短时间跨度内,这在这个用例中确实是不可取的。

我的 Messenger 配置 (config/packages/messenger.yaml) 如下所示

framework:
  messenger:
    default_bus: messenger.bus.default

    transports:
      transport_without_retry:
        dsn: '%env(REDIS_DSN)%/without_retry'
        retry_strategy:
          max_retries: 0
      transport_with_retry:
        dsn: '%env(REDIS_DSN)%/with_retry'
        retry_strategy:
          max_retries: 5
          delay: 10000 # 10 seconds
          multiplier: 3
          max_delay: 3600000
    routing:
      'App\Message\RetryWorthMessage': transport_with_retry

我尝试用 Doctrine 替换 Redis(作为重试传输的实现),瞧——延迟开始按预期工作。因此,我怀疑 Redis 传输实现不支持延迟重试。但是我仔细阅读了文档,搜索了相关的 Github 问题,仍然没有找到明确的答案。

所以我的问题是:Redis 传输是否支持延迟重试?如果是这样,我该如何让它发挥作用?

【问题讨论】:

【参考方案1】:

原来Redis传输支持延迟重试,但是only since Messenger version 4.4.

【讨论】:

以上是关于Symfony Messenger:重试延迟不适用于 Redis 传输的主要内容,如果未能解决你的问题,请参考以下文章

Symfony Messenger:使用消息接口作为处理程序时重试失败的消息__invoke type-hint

Symfony Messenger 使用 Apache Kafka 作为队列传输

Symfony 信使队列与绑定键 - 重试策略

Symfony Messenger / RabbitMQ 检测请求消息

Symfony 5 Messenger 不自动配置消息处理程序

Symfony:我如何在 Messenger 中使用远程过程调用(RPC)?