Version 0.0.0.1

Примечания к релизу: Версия 0.0.0.1

Введение

Это первая версия системы Model Event Observer, предназначенной для захвата событий, связанных с моделями (например, операции вставки и обновления), и публикации их в RabbitMQ с использованием topic exchange. Данная версия закладывает основу для построения событийно-ориентированной архитектуры, обеспечивая эффективное взаимодействие между различными компонентами системы.


Возможности

  1. Захват и публикация событий

    • Захватывает события INSERT и UPDATE из Active Record моделей.
    • Публикует события в RabbitMQ с использованием структурированного формата ключа маршрутизации: <from>.<model>.<event>.<scenario>.
    • Поддерживает JSON-сериализацию данных событий для удобного использования потребителями.
  2. Дизайн ключей маршрутизации

    • Реализован гибкий формат ключей маршрутизации:
      • <from>: Идентифицирует источник события (например, название сервиса или приложения).
      • <model>: Указывает класс модели, связанной с событием.
      • <event>: Определяет тип события (insert, update).
      • <scenario>: Предоставляет дополнительный контекст операции (например, default, payment, archive).
  3. Поддержка Topic Exchange

    • Использует topic exchange RabbitMQ для гибкой маршрутизации.
    • Позволяет потребителям подписываться на определенные шаблоны событий с использованием подстановочных символов (* и #).
  4. Управление состоянием

    • Отслеживает изменения состояния моделей в течение жизненного цикла запроса.
    • Агрегирует несколько изменений в одно событие для эффективной обработки.
  5. Расширяемость

    • Разработано с учетом будущих улучшений, таких как поддержка дополнительных типов событий (delete) и пользовательских полезных нагрузок.

Известные ограничения

  • Типы событий: В текущей версии поддерживаются только события INSERT и UPDATE. Поддержка событий DELETE будет добавлена в будущих релизах.
  • Обработка ошибок: Реализована базовая обработка ошибок, но механизмы повторных попыток и очереди недоставленных сообщений пока не поддерживаются.
  • Тестирование производительности: Система протестирована в среде разработки. Требуется дополнительное тестирование для сценариев с высокой пропускной способностью.

Установка и настройка

  1. Предварительные требования

    • PHP 7.4 или выше.
    • Фреймворк Yii2.
    • Сервер RabbitMQ с topic exchange, названным router.
  2. Настройка

    • Добавьте поведение ModelChangeBehavior к вашим Active Record моделям.
    • Настройте компонент ModelEventObserver в конфигурации приложения Yii2:
      'components' => [
          'modelEventObserver' => [
              'class' => \deck\ModelEvent\ModelEventObserver::class,
              'from' => 'your_service_name',
          ],
      ],
  3. Настройка RabbitMQ

    • Создайте topic exchange с именем router.
    • Привяжите очереди к exchange, используя соответствующие ключи маршрутизации (например, *.User.*.* для событий, связанных с пользователями).

Пример использования

  1. Поведение модели Добавьте поведение ModelChangeBehavior к вашим Active Record моделям:

    public function behaviors()
    {
        return [
            \deck\ModelEvent\ModelChangeBehavior::class,
        ];
    }
  2. Публикация событий При сохранении модели событие автоматически публикуется в RabbitMQ. Например:

    • Ключ маршрутизации: service1.User.insert.default
    • Полезная нагрузка:
      {
          "from": "service1",
          "model": "User",
          "id": "123",
          "event": "insert",
          "scenario": "default",
          "payload": {
              "old": {},
              "new": {
                  "id": 123,
                  "name": "Иван Иванов",
                  "email": "ivan@example.com"
              }
          },
          "previous": [],
          "extra": {}
      }

Планы на будущее

  • Добавить поддержку событий DELETE.
  • Реализовать расширенную обработку ошибок и механизмы повторных попыток.
  • Внедрить поддержку пользовательских процессоров событий.
  • Оптимизировать производительность для сценариев с высокой пропускной способностью.
  • Предоставить панель мониторинга для отслеживания опубликованных событий.