1

I have a Symfony 4 application using the Symfony Messenger component (version 4.3.2) to dispatch messages. For asynchronous message handling some Redis transports are configured and they work fine. But then I decided that one of them should retry a few times when message handling fails. I configured a retry strategy and the transport actually started retrying on failure, but it seems to ignore the delay configuration (keys delay, multiplier, max_delay) and all the retry attempts are always made without any delay, all within one second or a similarly short timespan, which is really undesirable in this use case.

My Messenger configuration (config/packages/messenger.yaml) looks like this

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

I tried replacing Redis with Doctrine (as implementation of the retrying transport) and voila - the delays started to work as expected. I therefore suspect that the Redis transport imlementation doesn't support delayed retry. But I read the docs carefully, searched related Github issues, and still didn't find a definite answer.

So my question is: does Redis transport support delayed retry? If it does, how do I make it work?

igneus
  • 963
  • 10
  • 25

1 Answers1

0

It turned out that Redis transport supports delayed retry, but only since Messenger version 4.4.

igneus
  • 963
  • 10
  • 25