Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/chocofamilyme/pubsub-life
Библиотека реализует паттерн Pub/Sub
https://github.com/chocofamilyme/pubsub-life
publisher-subscriber pubsub rabbitmq
Last synced: about 2 months ago
JSON representation
Библиотека реализует паттерн Pub/Sub
- Host: GitHub
- URL: https://github.com/chocofamilyme/pubsub-life
- Owner: chocofamilyme
- Created: 2020-01-15T07:51:48.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2020-09-10T09:43:02.000Z (over 4 years ago)
- Last Synced: 2024-09-19T08:38:50.444Z (5 months ago)
- Topics: publisher-subscriber, pubsub, rabbitmq
- Language: PHP
- Homepage:
- Size: 660 KB
- Stars: 0
- Watchers: 6
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Библиотека pub/sub
Библиотека реализует событийную архитектуру приложений (Event-Driven Architecture).
Рабочий пример можно посмотреть вот здесь: https://github.com/chocofamilyme/pubsub-life/tree/master/examples
### Возможности
- Публикация событий без транзакции
- Подписка на события
- Повторная отправка события в ту же очередь при необходимости### Требования
- PHP >=5.6
- PHP ext-sockets### Установка
```
composer require chocofamilyme/pubsub-life
```### Настройка
На данный момент библиотека работает только с RabbitMQ, при желании можно добавить другие.
#### Настройка конфигов
```php
'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).
В подписчик можно передавать следующие настройки:
| Ключ | Тип | Описание |
|--|--|--|
| **durable** | bool | сохранять на диск данные, для большей надежности |
| **queue** | array | настройки самой очереди |
| **prefetch_count** | int | количество одноновременно обрабатываемых сообщений, одним обработчиком (не всеми) |
| **no_ack** | bool | требуется ли подтверждение сообщений |
| **auto_delete** | bool | Удаление exchange, если нет подключений к нему |
| **app_id** | string | уникальный ID приложения. Можно использовать для идентификации откуда событие пошло изначально |
| **long_liver** | bool | запускать ли воркер в цикле (по-умолчанию true) |**TODO:**
1. Реализовать транзакционность (возможно обертка над библиотекой)
2. Внедрить middleware-объекты для реализации разных обработчиков (логирование, обработка исключений, перезапуск callback-функции и тд)
3. Покрыть тестами (50%)