PHPackages                             mix8872/rabbitmq-rpc - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. mix8872/rabbitmq-rpc

ActiveLibrary[API Development](/categories/api)

mix8872/rabbitmq-rpc
====================

Json RPC implementation over rabbitmq

v1.1.2(1y ago)055MITPHPPHP ^8.3

Since Apr 7Pushed 3mo ago2 watchersCompare

[ Source](https://github.com/mix8872/rabbitmq-rpc)[ Packagist](https://packagist.org/packages/mix8872/rabbitmq-rpc)[ RSS](/packages/mix8872-rabbitmq-rpc/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (1)Versions (11)Used By (0)

Реализация JSON RPC через RabbitMQ
==================================

[](#реализация-json-rpc-через-rabbitmq)

Способ позволяет выполнять функции с аргументами на удаленном сервисе (или группе сервисов).

Зависимости:
------------

[](#зависимости)

- php 8.\*
- php-amqplib
- `needle-project/laravel-rabbitmq`,
    используется форк `git@github.com:mix8872/laravel-rabbitmq.git` в котором сняты ограничения на максимальное время работы и количество запросов

Принцип работы
--------------

[](#принцип-работы)

Для выполнения процедур используется json формат сообщения rmq, который содержит следующие поля:

- **'request\_id' =&gt; 'string|required'** | ID запроса - добавляется автоматически
- **'reply\_to' =&gt; 'string|required'** | имя маршрута rmq для ответа - добавляется автоматически из `config('app.name')`
    на этот маршрут должна быть подписана очередь, которую слушает отправитель запроса, чтоб получить ответ или уведомление об ошибке
- **'action' =&gt; 'string|required\_without:error|regex:/\[a-z\]+.\[a-z\]+/ui'** | формат поля action: 'псевдоним\_класса.метод'
    псевдоним\_класса - ключ массива в конфиге laravel\_rabbitmq.rpc
- **'attributes' =&gt; 'array'** | массив атрибутов \[ключ =&gt; значение\]
- **'error' =&gt; 'string|required\_without:action'** | ответ ошибкой на предыдущий запрос
- **'reply\_for' =&gt; 'string|required\_with:error'** | ИД предыдущего запроса, обязателен, если отвечаем ошибкой

Подписчик RMQ получает сообщение, по полю `action` ищет нужный метод и выполняет его, подставляя в него аргументы
из поля `attributes`.

Все сообщения в RabbitMQ шифруются через `Crypt::encryptString`, таким образом во всех связанных сервисах должен быть указан один и тот же `APP_KEY`.

Конфигурирование
----------------

[](#конфигурирование)

В разделе `queues` задать все необходимые очереди, например:

```
...
'queues' => [
        '' => [
            'connection' => 'grch',
            'name' => '',
            'attributes' => [
                'durable' => true,
                'bind' => [
                    ['exchange' => 'GRCHExchanger', 'routing_key' => 'projectsData'], // подписываем очередь на обновления проектов
                    ['exchange' => 'GRCHExchanger', 'routing_key' => 'usersData'], // подписываем очередь на обновления пользователей
                    ['exchange' => 'GRCHExchanger', 'routing_key' => \config('app.name')], // собственная очередь сервиса
                ],
            ],
        ],
    ],
...
```

В разделе `consumers` указать:

```
...
'consumers' => [
        '' => [
            'queue' => '',
            'message_processor' => RMQRpcProcessor::class,
        ],
    ],
...
```

Добавить в конфиг `laravel_rabbitmq` блок `rpc` -&gt; `processors`, в котором задать массив обработчиков в формате
` => `, например:

```
...
'rpc' => [
        'processors' => [
            'users' => UsersProcessor::class,
            'projects' => ProjectsProcessor::class,
        ],
    ],
...
```

Использование
-------------

[](#использование)

### Создаем обработчики

[](#создаем-обработчики)

Создаем классы обработчиков и заполняем их в конфиг.
Каждому обработчику должен быть назначен уникальный псевдоним, который будет использоваться для вызова процедур.

Класс обработчика должен содержать публичные методы.
Каждый публичный метод может быть вызван через rpc.
Допускается использование статических методов.
Если запрошенный метод является статическим - он будет выполнен напрямую, в качестве его аргументов будет распакован массив `attributes` из входящего запроса, последним аргументом будет передан весь массив данных входящего запроса в виде именованного параметра `$arData`, иначе будет создан экземпляр класса и выполнен запрошенный метод у объекта. В конструктор класса будет передан весь массив данных входящего запроса в виде именованного параметра `$arData`.

Таким образом статический метод обработчика или конструктор класса обработчика (при его наличии) должны содержать обязательный аргумент
`array $arData`.

### Отправка сообщения

[](#отправка-сообщения)

#### Выполнение процедуры

[](#выполнение-процедуры)

Например, отправка команды на создание проекта:

```
RMQRpcPublisher::make()
    ->action('projects.create')
    ->attributes([
        'project' => $project->toArray(),
    ])
    ->publish('projectsData');
```

где:

- **'projects.create'** - экшн, **projects** - псевдоним класса, **create** - метод класса
- **'project'** - аргумент для передачи в метод класса
- **'projectsData'** - routing key, для отправки в очереди, подписанные на этот маршрут

#### Ответ с ошибкой

[](#ответ-с-ошибкой)

```
RMQRpcPublisher::make()
    ->error()
    ->replyFor()
    ->publish();
```

### Запускаем слушатель rmq:

[](#запускаем-слушатель-rmq)

`php artisan rabbitmq:consume  --time=-1 --messages=-1`, где:

- **--time=-1** - без ограничения по времени
- **--messages=-1** - без ограничения по количеству сообщений

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance66

Regular maintenance activity

Popularity8

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

10

Last Release

389d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/52c5dc1f7474e82117d2503c0d9c478ead60d46790e16b935f28fae4ffc29513?d=identicon)[mix8872](/maintainers/mix8872)

---

Top Contributors

[![mix8872](https://avatars.githubusercontent.com/u/25277872?v=4)](https://github.com/mix8872 "mix8872 (15 commits)")

### Embed Badge

![Health badge](/badges/mix8872-rabbitmq-rpc/health.svg)

```
[![Health](https://phpackages.com/badges/mix8872-rabbitmq-rpc/health.svg)](https://phpackages.com/packages/mix8872-rabbitmq-rpc)
```

###  Alternatives

[stripe/stripe-php

Stripe PHP Library

4.0k143.3M480](/packages/stripe-stripe-php)[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M272](/packages/twilio-sdk)[facebook/php-business-sdk

PHP SDK for Facebook Business

90821.9M34](/packages/facebook-php-business-sdk)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

74513.7M114](/packages/meilisearch-meilisearch-php)[google/gax

Google API Core for PHP

265103.1M454](/packages/google-gax)[google/common-protos

Google API Common Protos for PHP

173103.7M50](/packages/google-common-protos)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
