Почему не флашатся сущности обрабатываемые в Symfony Messenger?

Symfony Messenger - это компонент Symfony, предназначенный для работы с очередями сообщений и обработки сообщений в фоновом режиме. В основе его работы лежит шаблон проектирования "Посредник" (Mediator), который позволяет разделить процесс отправки и обработки сообщений на две отдельные части.

Одной из особенностей работы Symfony Messenger является то, что сущности, которые передаются в очередь для обработки, не "флашатся" автоматически. Под "флашем" понимается процесс сохранения изменений в базе данных, который происходит в конце рабочей единицы работы.

Понадобилось такое поведение потому что обработка сообщений в Symfony Messenger может происходить в асинхронном режиме. Он предназначен для обработки сообщений в фоне, что позволяет сделать приложение более отзывчивым. После отправки сообщений в очередь, запрос может продолжать работу, не ожидая результата и не осуществляя сохранение изменений в базе данных.

Кроме того, перенос сохранения изменений в базу данных из процесса обработки сообщений позволяет уменьшить потенциальные конфликты, связанные с одновременным доступом к данным. Если допустить сохранение изменений прямо в процессе обработки сообщений, могут возникнуть ситуации, когда несколько обработчиков пытаются изменить одну и туже запись в базе данных одновременно, что может привести к конфликтам и некорректным результатам.

Вместо этого, Symfony Messenger предлагает использовать шаблон "Снятие" (Detachable), который позволяет открепить отслеживание изменений сущности от менеджера сущностей и сделать ее "свободной" от него. Затем можно передать эту "свободную" сущность в обработчик и внутри обработчика снова прикрепить ее к менеджеру сущностей для сохранения изменений. Это позволяет уменьшить потенциальные конфликты и эффективно управлять состоянием сущностей во время обработки сообщений.

В заключение, отсутствие автоматического "флаша" сущностей, обрабатываемых в Symfony Messenger, является обоснованным выбором разработчиков Symfony для обеспечения асинхронной обработки сообщений и управления состоянием сущностей во время обработки сообщений. Это позволяет создать отзывчивое и эффективное приложение и предотвратить потенциальные конфликты при одновременном доступе к данным.