veilletech.fr
27 oct. Feed du jour
#07 SYMFONY Article

Symfony 8.2 : l'inbox Messenger contre les doublons

Livrer au moins une fois ne devrait plus vouloir dire traiter deux fois.

Symfony 8.2 ajoute à Messenger une option inbox qui note, dans la même transaction que les handlers, les messages déjà traités dans une table messenger_inbox, et ignore leurs redistributions. C'est la contrepartie de l'outbox : plus besoin de rendre chaque handler idempotent à la main. Elle exige le bridge Doctrine, la même connexion que les handlers, et une rétention supérieure au délai de redistribution.

2 min de lectureintermédiairevidéo 1:15
Partager
Sommaire5 sections
  1. Ce qui change
  2. Comment ça fonctionne
  3. Les limites
  4. Comment s'y prendre
  5. À retenir

Ce qui change

Un broker livre un message au moins une fois. Si un worker valide les changements de ses handlers puis plante avant d'acquitter, le message revient et les handlers tournent deux fois : client débité en double, courriel en double. Jusqu'ici, la parade était de rendre chaque handler idempotent à la main.

Symfony 8.2 apporte la seconde moitié du pattern dont l'outbox était la première : l'inbox, qui mémorise les messages déjà traités.

Comment ça fonctionne

L'option inbox du transport écrit, dans la transaction qui exécute vos handlers, le nom du transport et l'identifiant du message dans une table messenger_inbox. Si le message revient, ses handlers sont ignorés et il est acquitté.

Les limites

Comment s'y prendre

Créez la table, ou ajoutez-la par migration Doctrine puisqu'elle fait partie de votre schéma :

Terminal
php bin/console messenger:setup-transports

Source : blog Symfony, 26 octobre 2026. Source en anglais.