Symfony Messenger: задержка повтора не работает с транспортом Redis - PullRequest
0 голосов
/ 16 марта 2020

У меня есть приложение Symfony 4, использующее компонент Symfony Messenger (версия 4.3.2) для отправки сообщений. Для асинхронной обработки сообщений некоторые транспорты Redis настроены и работают нормально. Но потом я решил, что один из них должен повторить попытку несколько раз, когда обработка сообщения не удалась. Я настроил стратегию повторных попыток , и транспорт фактически начал повторять попытки при сбое, но, похоже, он игнорирует конфигурацию задержки (ключи delay, multiplier, max_delay), и все попытки повторения всегда выполняются без каких-либо задержек, все в течение одной секунды или аналогичного короткого промежутка времени, что действительно нежелательно в этом случае использования.

Конфигурация My 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

I попытался заменить Redis на Doctrine (в качестве реализации повторяющегося транспорта) и вуаля - задержки начали работать, как и ожидалось. Поэтому я подозреваю, что реализация транспорта Redis не поддерживает отложенную повторную попытку. Но я внимательно прочитал документы, искал связанные с ними проблемы с Github и до сих пор не нашел однозначного ответа.

Итак, мой вопрос: поддерживает ли Redis транспорт отложенную повторную попытку? Если да, то как мне заставить это работать?

1 Ответ

0 голосов
/ 17 марта 2020

Оказалось, что транспорт Redis поддерживает отложенную попытку, но только с версии Messenger 4.4 .

...