Download the PHP package sbooker/domain-events-persistence without Composer
On this page you can find all versions of the php package sbooker/domain-events-persistence. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download sbooker/domain-events-persistence
More information about sbooker/domain-events-persistence
Files in sbooker/domain-events-persistence
Package domain-events-persistence
Short Description Domain events storage
License MIT
Informations about the package domain-events-persistence
Read in English
Domain Events Persistence Library (sbooker/domain-events-persistence
)
Готовая реализация паттерна Transactional Outbox для библиотеки sbooker/domain-events.
Назначение библиотеки
Эта библиотека решает проблему надежности в системах, управляемых событиями: как гарантировать, что доменное событие будет обработано, если оно было создано в рамках транзакции, которая успешно завершилась?
sbooker/domain-events-persistence
решает эту проблему, сохраняя ваши доменные события в постоянное хранилище (например, в ту же базу данных) внутри той же транзакции, что и ваши доменные сущности. Это достигается благодаря глубокой интеграции с sbooker/transaction-manager.
Затем отдельный фоновый процесс (консьюмер) считывает эти события и обрабатывает их, используя sbooker/persistent-pointer для отслеживания прогресса.
Ключевые особенности
- Атомарное сохранение: События сохраняются в той же транзакции, что и агрегаты. Гарантируется, что либо сохраняется всё, либо ничего.
- Полностью автоматическое созранение событий:
DomainEventPreCommitProcessor
автоматически извлекает события из ваших сущностей прямо перед коммитом транзакции. Больше не нужно вызывать$entity->dispatchEvents()
вручную! - Надежный консьюмер: Встроенный механизм
Consumer
используетpersistent-pointer
для отслеживания позиции последнего обработанного события, что гарантирует обработку "хотя бы один раз" (at-least-once). - Готовность к параллельной обработке: Архитектура консьюмеров позволяет запускать несколько воркеров для обработки событий без брокера сообщений.
- Гибкое именование событий: Поддерживаются разные стратегии именования событий (по имени класса или через карту
MapNameGiver
) для долгосрочной стабильности.
Установка
Вам также понадобятся реализации для ваших фреймворков и ORM:
Быстрый старт
Шаг 1: Конечная цель: чистый код слоя приложения
Благодаря полной автоматизации, ваш код в слое проложения становится предельно простым и не знает ничего о событиях.
Шаг 2: Сборка зависимостей (Composition Root)
Чтобы достичь такой простоты, вам нужно один раз собрать все компоненты вместе в вашем DI-контейнере.
Шаг 3: Создание воркера-консьюмера
Создайте консольную команду или фоновый процесс (рекомендуется) на базе решений на event loop, например на sbooker/event-loop-worker, который будет в цикле обрабатывать события.
Продвинутое использование
Внешняя генерация позиций (PositionGenerator
)
По умолчанию, position
для PersistentEvent
предполагается автоинкрементным полем в базе данных, и библиотека не управляет его генерацией. Однако существуют сценарии, когда последовательность событий должна управляться извне:
- Интеграция с legacy-системой, у которой уже есть своя нумерация событий.
- Использование СУБД, которые не поддерживают
SEQUENCE
или имеют проблемы сAUTO_INCREMENT
в кластерных конфигурациях (например, старые версии MySQL).
Для этих случаев предназначен необязательный интерфейс PositionGenerator
.
Решение в рамках экосистемы: sbooker/persistent-sequences
Для решения этой задачи без привлечения внешней инфраструктуры (вроде Redis) была создана библиотека sbooker/persistent-sequences. Она реализует персистентную, конкурентно-безопасную последовательность средствами реляционной СУБД.
Шаг 1: Установите и настройте persistent-sequences
Сначала установите библиотеку:
Затем создайте адаптер, который будет связывать persistent-sequences
с интерфейсом PositionGenerator
.
Шаг 2: Передайте его в PersistentPublisher
Теперь при сборке зависимостей просто передайте ваш генератор третьим аргументом в конструктор PersistentPublisher
.
Теперь при сохранении события PersistentPublisher
будет вызывать ваш SequencePositionGenerator
для получения и установки позиции, обеспечивая единую, монотонно возрастающую последовательность для всех событий.
License
See LICENSE file.
All versions of domain-events-persistence with dependencies
psr/log Version ^1.0 || ^2.0 || ^3.0
sbooker/domain-events Version ^2.0
sbooker/transaction-manager Version ^2.3
sbooker/persistent-pointer Version ^1.0
symfony/serializer Version ^5.0 || ^6.0