chocofamilyme / pubsub-life
Библиотека для реализаций паттерна Pub/Sub
Installs: 12 152
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 6
Forks: 0
Open Issues: 0
Requires
- php-amqplib/php-amqplib: ^2.11
Requires (Dev)
- codeception/codeception: ~3.0
- ramsey/uuid: ^3.9
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-11-10 19:05:25 UTC
README
Библиотека реализует событийную архитектуру приложений (Event-Driven Architecture).
Рабочий пример можно посмотреть вот здесь: https://github.com/chocofamilyme/pubsub-life/tree/master/examples
Возможности
- Публикация событий без транзакции
- Подписка на события
- Повторная отправка события в ту же очередь при необходимости
Требования
- PHP >=5.6
- PHP ext-sockets
Установка
composer require chocofamilyme/pubsub-life
Настройка
На данный момент библиотека работает только с RabbitMQ, при желании можно добавить другие.
Настройка конфигов
'eventsource' => [ 'default' => env('MESSAGE_BROKER', 'rabbitmq'), 'drivers' => [ 'rabbitmq' => [ 'adapter' => 'RabbitMQ', 'host' => env('EVENTSOURCE_HOST', 'eventsource'), 'port' => env('EVENTSOURCE_PORT', '5672'), 'user' => env('EVENTSOURCE_USER', 'guest'), 'password' => env('EVENTSOURCE_PASSWORD', 'guest'), ], ], ]
Полный список смотрите - https://github.com/php-amqplib/php-amqplib
Использование
Для RabbitMQ переменная $routeKey
должна состоять минимум из двух частей разделенных точкой .
. Пример order.created
. Имя Exchange будет содержать первый блок, т.е. order
. После этого если зайдете в админку rabbitmq должен создаться exchange с именем order
.
Обновленно: начиная с версии 2.* можно указать exchange
, которому привяжется маршрут $routeKey
Обновленно: начиная с версии 2.* можно указать exchange
и связать с ним маршрут. Теперь можно указать массив маршрутов.
Чтобы обратно отправить сообщение в очередь необходимо в callback-функции кинуть исключение Chocofamily\PubSub\Exceptions\RetryException
. Сообщение может максимум 5 раз обработаться повторно, после этого он попадает в очередь мертвых сообщений (exchange = DLX).
В подписчик можно передавать следующие настройки:
TODO:
- Реализовать транзакционность (возможно обертка над библиотекой)
- Внедрить middleware-объекты для реализации разных обработчиков (логирование, обработка исключений, перезапуск callback-функции и тд)
- Покрыть тестами (50%)