Skip to main content

Initial Event Propagation

В парадигме Initial Event Propagation (IEP) мы рассматриваем нашу распределенную систему как что-то неизменное само по себе.

Однако, есть несколько видов событий, которые могут породить волну запросов в системе, которая распространяется по сервисам пока не утихнет:

  1. В систему поступил внешний запрос. Например от мобильного приложения, или от сервиса другой команды.

  2. Внутри системы запустилась консольная команда. Например, по расписанию, а может и инженером вручную.

Для решения ряда задач в рамках микро-сервисной архитектуры нам необходимо зафиксировать метаданные по изначальным событиям и распространить эти метаданные со всей волной запросов.

Примеры таких задач:

  • Сделайте нам для 20 разных сущностей историю изменений. Чтобы было в административном интерфейсе видно кто (логин пользователя) и когда такое-то действие над сущностью совершил;

  • Вот есть идентификатор запроса от мобильного приложения, добавьте его в логи всех backend сервисов;

  • В API Gateway вы авторизуете пользователя. Прокидывайте токен авторизации во все backend сервисы для проверки доступа;

Initial Event Propagation - совокупность принципов и технических решения для решения подобных задач.

Состав метаданных по изначальному событию, которые мы фиксируем и распространяем

Screenshot

Принципы IEP#

  1. Не модифицируем InitialEventDTO в процессе его распространения по сервисам;
  2. Используем заголовки (headers) вместо тела запроса (body) везде, где это возможно;
  3. Максимально решаем задачу на уровне конфигурации сервиса (инфраструктурные пакеты, middleware), а не конфигурации конкретных запросов;
  4. Предоставляем инфраструктурный код для всех типов коммуникаций внутри 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

Поддерживаемые типы коммуникаций между сервисами

  1. HTTP запросы
  2. artisan команды
  3. Laravel scheduled tasks
  4. Laravel Queued Jobs(*)/Action
  5. Kafka