Le pattern "Transactional Outbox" vise à résoudre le problème de la double écriture entre une base de données relationnelle et un système de messagerie comme RabbitMQ dans les applications événementielles Symfony. Ce problème survient lorsque la persistance des données dans la base de données et l'envoi d'un événement correspondant à un autre système ne sont pas atomiques, entraînant des incohérences si l'un des deux processus échoue.
Ce pattern garantit l'atomicité en écrivant l'événement dans une table dédiée de la base de données, la table "outbox_message", au sein de la même transaction que les données métier. Ainsi, soit les données métier et l'enregistrement de l'événement sont persistés ensemble, soit aucun des deux n'est enregistré.
Un processus séparé, l'"Outbox Relay", est ensuite responsable de lire les messages non publiés de cette table, de les envoyer à RabbitMQ, puis de marquer ces messages comme publiés. Cette approche garantit qu'un événement est soit bien enregistré dans la base de données et envoyé au système de messagerie, soit ni l'un ni l'autre, résolvant ainsi les échecs critiques qui pourraient survenir entre les deux écritures indépendantes.