{"id":23141905,"url":"https://github.com/chocofamilyme/pubsub-life","last_synced_at":"2025-04-04T11:32:48.627Z","repository":{"id":56953794,"uuid":"234027418","full_name":"chocofamilyme/pubsub-life","owner":"chocofamilyme","description":"Библиотека реализует паттерн Pub/Sub","archived":false,"fork":false,"pushed_at":"2020-09-10T09:43:02.000Z","size":676,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-02-09T21:23:08.326Z","etag":null,"topics":["publisher-subscriber","pubsub","rabbitmq"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chocofamilyme.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-01-15T07:51:48.000Z","updated_at":"2020-09-10T09:37:16.000Z","dependencies_parsed_at":"2022-08-21T08:20:35.577Z","dependency_job_id":null,"html_url":"https://github.com/chocofamilyme/pubsub-life","commit_stats":null,"previous_names":[],"tags_count":46,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocofamilyme%2Fpubsub-life","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocofamilyme%2Fpubsub-life/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocofamilyme%2Fpubsub-life/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chocofamilyme%2Fpubsub-life/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chocofamilyme","download_url":"https://codeload.github.com/chocofamilyme/pubsub-life/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247170925,"owners_count":20895549,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["publisher-subscriber","pubsub","rabbitmq"],"created_at":"2024-12-17T14:14:51.491Z","updated_at":"2025-04-04T11:32:48.600Z","avatar_url":"https://github.com/chocofamilyme.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Библиотека pub/sub\n\nБиблиотека реализует событийную архитектуру приложений (Event-Driven Architecture).\n\nРабочий пример можно посмотреть вот здесь: https://github.com/chocofamilyme/pubsub-life/tree/master/examples\n\n### Возможности\n- Публикация событий без транзакции\n- Подписка на события\n- Повторная отправка события в ту же очередь при необходимости\n\n### Требования\n- PHP \u003e=5.6\n- PHP ext-sockets\n\n### Установка\n```\ncomposer require chocofamilyme/pubsub-life\n```\n\n### Настройка\n\nНа данный момент библиотека работает только с RabbitMQ, при желании можно добавить другие.\n\n#### Настройка конфигов\n```php\n'eventsource' =\u003e [\n    'default' =\u003e env('MESSAGE_BROKER', 'rabbitmq'),\n\n    'drivers' =\u003e [\n        'rabbitmq' =\u003e [\n            'adapter'    =\u003e 'RabbitMQ',\n            'host'     =\u003e env('EVENTSOURCE_HOST', 'eventsource'),\n            'port'     =\u003e env('EVENTSOURCE_PORT', '5672'),\n            'user'     =\u003e env('EVENTSOURCE_USER', 'guest'),\n            'password' =\u003e env('EVENTSOURCE_PASSWORD', 'guest'),\n        ],\n    ],\n]\n```\n\nПолный список смотрите - https://github.com/php-amqplib/php-amqplib\n\n### Использование\n\nДля RabbitMQ переменная `$routeKey` должна состоять минимум из двух частей разделенных точкой `.`. Пример `order.created`. Имя Exchange будет содержать первый блок, т.е. `order`. После этого если зайдете в админку rabbitmq должен создаться exchange с именем `order`.\n\n**Обновленно**: начиная с версии 2.* можно указать `exchange`, которому привяжется маршрут `$routeKey`\n\n**Обновленно**: начиная с версии 2.* можно указать `exchange` и связать с ним маршрут. Теперь можно указать массив  маршрутов.\n\nЧтобы обратно отправить сообщение в очередь необходимо в callback-функции кинуть исключение `Chocofamily\\PubSub\\Exceptions\\RetryException`. Сообщение может максимум 5 раз обработаться повторно, после этого он попадает в очередь мертвых сообщений (exchange = DLX).\n\nВ подписчик можно передавать следующие настройки:\n\n | Ключ | Тип | Описание |\n |--|--|--|\n | **durable** | bool | сохранять на диск данные, для большей надежности |\n | **queue** | array | настройки самой очереди |\n | **prefetch_count** | int | количество одноновременно обрабатываемых сообщений, одним обработчиком (не всеми) |\n | **no_ack** | bool | требуется ли подтверждение сообщений |\n | **auto_delete** | bool | Удаление exchange, если нет подключений к нему |\n | **app_id** | string | уникальный ID приложения. Можно использовать для идентификации откуда событие пошло изначально |\n | **long_liver** | bool | запускать ли воркер в цикле (по-умолчанию true) |\n\n**TODO:**\n\n 1. Реализовать транзакционность (возможно обертка над библиотекой)\n 2. Внедрить middleware-объекты для реализации разных обработчиков (логирование, обработка исключений, перезапуск callback-функции и тд)\n 3. Покрыть тестами (50%)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchocofamilyme%2Fpubsub-life","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchocofamilyme%2Fpubsub-life","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchocofamilyme%2Fpubsub-life/lists"}