Download the PHP package chocofamilyme/pubsub without Composer
On this page you can find all versions of the php package chocofamilyme/pubsub. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download chocofamilyme/pubsub
More information about chocofamilyme/pubsub
Files in chocofamilyme/pubsub
Package pubsub
Short Description Библиотека для реализаций паттерна Pub/Sub
License BSD-3-Clause
Homepage https://github.com/chocofamilyme/pubsub
Informations about the package pubsub
Библиотека для реализации паттерна pub/sub для фреймворка Phalcon
Библиотека реализует событийную архитектуру приложений (Event-Driven Architecture). Работает с фреймворком Phalcon 3.x, но при желании можно легко адаптировать под другие фреймворки.
Рабочий пример можно посмотреть вот здесь: https://github.com/chocofamilyme/pubsub/tree/master/examples
Возможности
- Транзакционное сохранение моделей ORM и публикация события
- Публикация событий без транзакции
- Подписка на события
- Повторная отправка события в ту же очередь при необходимости
- Сохранение в общую очередь всех не обработанных и истекших сообщений. Из этой очереди потом можно сохранить куда-то в БД и обработать индивидуально
Требования
- Phalcon 3.x+
- PHP 7.0+
Установка
Настройка
На данный момент библиотека работает только с RabbitMQ, при желаении можно добавить другие.
Настройка конфигов
Полный список смотрите - https://github.com/php-amqplib/php-amqplib
Добавляем брокер в DI контейнер
Здесь $cache
объект реализующий интерефейс Phalcon\Cache\BackendInterface
. Кэш используется для подсчета количества повторной обработки определенного сообщения.
Таблица параметров с настройками
Ключ | Значение | Описание |
---|---|---|
connection | По умолчанию PhpAmqpLib\Connection\AMQPLazyConnection::class | php-amqplib |
connection_timeout | По умолчанию 3.0 (сек) | Максимальное время на соединение с сервером Rabbitmq |
read_write_timeout | По умолчанию 3.0 (сек) | Максимальное время на получение |
heartbeat | По умолчанию 60 (сек) | RabbitMQ Doc |
keepalive | По умолчанию false | RabbitMQ Doc |
context | По умолчанию null | RabbitMQ Doc |
prefetch_count | По умолчанию 1 | RabbitMQ Doc |
no_ack | По умолчанию false | RabbitMQ Doc |
durable | По умолчанию true | RabbitMQ Doc |
exclusive | По умолчанию false | RabbitMQ Doc |
queue | По умолчанию [] | RabbitMQ Doc |
basic_consume_exclusive | По умолчанию false | RabbitMQ Doc |
wait_allowed_methods | По умолчанию null | php-amqplib |
wait_non_blocking | По умолчанию true | php-amqplib |
wait_timeout | По умолчанию 0 | Максимальное время ожидания до получения первого сообщения |
exchange_type | По умолчанию topic | RabbitMQ Doc) |
app_id | По умолчанию '' | Индификатор приложения которое создает сообщение |
sleep | По умолчанию 0.1 секунды | Если wait_non_blocking равно true, то если нету задачи ждать время sleep |
Использование
Публикация
Публиковать сообщения можно используя класс Chocofamily\PubSub\Publisher
. Минимальный рабочий пример:
Для RabbitMQ переменная `$routeKey` должна состоять минимум из двух частей разделенных точкой `.`. Пример `order.created`. Имя Exchange будет содержать первый блок, т.е. `order`. После этого если зайдете в админку rabbitmq должен создаться exchange с именем `order`. Обновленно: начиная с версии 2.* можно указать `exchange`, которому привяжется маршрут `$routeKey, пример:
Подписка на событие
Для подписки на события используется класс Chocofamily\PubSub\Subscriber
. Минимальный рабочий пример:
``
Обновленно: начиная с версии 2.* можно указать exchange
и связать с ним маршрут. Теперь можно указать массив
маршрутов. Пример:
``
Чтобы обратно отправить сообщение в очередь необходимо в кэлбэк функции кинуть исключение Chocofamily\PubSub\Exceptions\RetryException
. Сообщение может максимум 5 раз обработаться повторно, после этого он попадает в очередь мертвых сообщений (exchange = DLX).
В подписчик можно передавать следующие настройки: `
Публикация используя транзакции БД
Этот способ необходим для атомарности сохранения сущности в БД и публикования события. Следующая картинка хорошо иллюстрирует как это работает:
Для этого необходимо создать таблицу events:
`
Пример использования: ``
Модель Order должна реализовывать итерфейс ModelInterface.
Обновленно: начиная с версии 2.* можно указать exchange
и связпть с ним маршрут. Привер:
``
Метод up
работает так
- db transaction start
- order->save();
- eventModel->save()
- db transaction commit
- event publish
Повторная отправка события
Для повторной отправке событие используется класс Chocofamily\PubSub\Services\EventRepeater
. Рабочий пример:
``
Очистка журнала событий
Для очистки событий используется класс Chocofamily\PubSub\Services\EventCleaner
с методом clean
.
Рабочий пример:
По умолчанию удаляетя событие больше 1 месяца. Если передать дату как второй параметр в конструкторе, то будет удалятся все событие до указонной даты:
@todo
- Написать интерфейс для транзакций и убрать зависимость от фреймворка
All versions of pubsub with dependencies
ext-json Version *
ext-phalcon Version >= 3.0.0
chocofamilyme/pathcorrelation Version 0.2.*
php-amqplib/php-amqplib Version ^3.1