Initial Event Propagation
В парадигме Initial Event Propagation (IEP) мы рассматриваем нашу распределенную систему как что-то неизменное само по себе.
Однако, есть несколько видов событий, которые могут породить волну запросов в системе, которая распространяется по сервисам пока не утихнет:
В систему поступил внешний запрос. Например от мобильного приложения, или от сервиса другой команды.
Внутри системы запустилась консольная команда. Например, по расписанию, а может и инженером вручную.
Для решения ряда задач в рамках микро-сервисной архитектуры нам необходимо зафиксировать метаданные по изначальным событиям и распространить эти метаданные со всей волной запросов.
Примеры таких задач:
Сделайте нам для 20 разных сущностей историю изменений. Чтобы было в административном интерфейсе видно кто (логин пользователя) и когда такое-то действие над сущностью совершил;
Вот есть идентификатор запроса от мобильного приложения, добавьте его в логи всех backend сервисов;
В API Gateway вы авторизуете пользователя. Прокидывайте токен авторизации во все backend сервисы для проверки доступа;
Initial Event Propagation - совокупность принципов и технических решения для решения подобных задач.
Состав метаданных по изначальному событию, которые мы фиксируем и распространяем
Принципы IEP
- Не модифицируем InitialEventDTO в процессе его распространения по сервисам;
- Используем заголовки (headers) вместо тела запроса (body) везде, где это возможно;
- Максимально решаем задачу на уровне конфигурации сервиса (инфраструктурные пакеты, middleware), а не конфигурации конкретных запросов;
- Предоставляем инфраструктурный код для всех типов коммуникаций внутри Ensi;
Техническая реализация
С технической точки зрения IEP реализуется через конфигурацию сервисов с использованием пакетов
GitHub - ensi-platform/php-initial-event-propagation
GitHub - ensi-platform/laravel-initial-event-propagation
а также функциональности middleware в наших пакетах для Kafka GitHub - ensi-platform/laravel-php-rdkafka-producer и GitHub - ensi-platform/laravel-php-rdkafka-consumer
Пример конфигурации - MR greensight / ensi / Communication / Communication
Поддерживаемые типы коммуникаций между сервисами
- HTTP запросы
- artisan команды
- Laravel scheduled tasks
- Laravel Queued Jobs(*)/Action
- Kafka