В предыдущей главе мы рассмотрели наиболее подходящий для начинающих учебник по RabbitMQ+PHP (шестая часть): использование Topic exchange (тематического обмена). С помощью реального кода мы можем четко понять общие правила соответствия и рабочий процесс. В этой главе мы рассмотрим RPC-модель RabbitMQ.
RabbitMQ установлен и запущен на localhost по стандартному порту (5672). Если вы используете другую машину, порт или учетные данные, вам потребуется настроить параметры подключения. Если вы столкнетесь с проблемами в этом учебнике, вы всегда можете связаться с нами по электронной почте.
Чтобы использовать RPC, необходимо понять, что это такое и как это работает. RPC (Remote Procedure Call Protocol) — это протокол удаленного вызова процедур. Обычно в больших компаниях каждый проект состоит из нескольких систем, таких как система управления запасами, система товаров, система заказов и т.д. Разные группы разработчиков поддерживают разные системы, каждая из которых работает на разных машинах. Однако часто требуется вызывать данные между машинами. Поскольку они не находятся на одной машине, вызовы должны осуществляться через сеть. Существует множество протоколов RPC, таких как Java RMI, WebApi и т.д.### Официальное описание RPC Хотя RPC является очень распространенной моделью в вычислениях, она часто подвергается критике. Проблемы возникают, когда программисты не знают, является ли вызов функции локальным или медленным RPC. Такое смешение приводит к непредсказуемому поведению системы и усложняет отладку. Неправильное использование RPC может привести к трудно поддерживаемому коду "спагетти", а не к упрощению программного обеспечения. Учитывая это, рассмотрите следующие рекомендации:
(2) Атрибуты сообщения
AMQP 0-9-1 протокол предварительно определяет 14 атрибутов, связанных с сообщением. Большинство атрибутов редко используются, но следующие являются исключениями:
Если для каждого RPC создается отдельная обратная вызов очередь, это будет очень неэффективно. Вместо этого можно создать отдельную обратную вызов очередь для каждого клиента. Однако, если очередь получает ответное сообщение, она может не знать, к какому запросу оно относится. Для этого используется атрибут correlationId. Мы должны установить уникальное значение для каждого запроса. Затем, получая сообщения из обратной вызов очереди, проверяем этот атрибут, чтобы связать ответ с запросом. Если мы получаем сообщение с неизвестным значением correlationId, можно смело игнорировать его — это не наш запрос. Вы можете задаться вопросом, почему следует игнорировать неизвестные сообщения в обратной вызов очереди, а не считать их ошибкой? Это связано с конкурентными условиями на сервере. Хотя это маловероятно, но если RPC-сервер отправляет нам результат, а затем выходит из строя до отправки обратного вызова, это может привести к получению сообщения с неизвестным значением correlationId. Если это произошло, перезапуск RPC-сервера приведет к повторной обработке запроса. Именно поэтому клиент должен хорошо обрабатывать повторные ответы, а RPC должен быть идемпотентным.
Основные шаги бизнес-логики:
public function call($body = null, $name = null)
{
if (! $body || ! $name) return false;
$this->response = null;
// Генерация уникального идентификатора corrId
$this->corr_id = uniqid();
// Установка параметров replyTo для очереди callback_queue и корреляционного идентификатора
$params = ['correlation_id' => $this->corr_id, 'reply_to' => $this->callback_queue];
$message = new AMQPMessage((string) $body, $params);
$this->amqp_channel->basic_publish($message, '', $name);
while (! $this->response) {
// Ожидание обработки
$this->amqp_channel->wait();
}
return intval($this->response);
}
Полный код Клиентский код RPC: https://gitee.com/jonny-li/rabbitmq-study/blob/master/rabbitmq_test/RPC/rpc_client.php### Код службы RPC (серверный код)
public function basic_consume($queue_name = null)
{
if (!$queue_name) return false;
// Обработчик
echo " [x] Ожидание RPC-запросов\n";
$callback = function ($response) {
$n = intval($response->body);
echo ' [.] Это обратный вызов данных:(', $response->body, ")\n";
$params = ['correlation_id' => $response->get('correlation_id')];
$msg = new AMQPMessage((string) $this->fib($n), $params);
$response->delivery_info['channel']->basic_publish($msg, '', $response->get('reply_to'));
};
}
```
[RpcServer] Ожидание RPC-запросов
[RpcClient] Запрос 55
[RpcServer receive] [.] Это обратный вызов данных: (10)
### Заключение
RPC (Remote Procedure Call) завершен. Это асинхронное взаимодействие между клиентом и сервером, где сервер отвечает на запросы клиента через уникальный идентификатор, используя временный и эксклюзивный канал для передачи данных обратно клиенту. В следующем разделе будет рассмотрена "реализация задержки RabbitMQ".### Оригинальная ссылка: [https://www.phpassn.com/article/112.html](https://www.phpassn.com/article/112.html)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )