Skip to main content

6、RPC

http://previous.rabbitmq.com/v3_5_7/tutorials/tutorial-six-php.html

有关RPC的说明

尽管RPC在计算中是一种非常常见的模式,但它经常受到批评。当程序员不知道函数调用是本地的还是慢的RPC时,会出现问题。这样的混淆导致系统不可预测,并增加了调试的不必要的复杂性。错误使用RPC可以导致不可维护的意大利面条代码,而不是简化软件。

考虑到这一点,请考虑以下建议:

确保明显哪个函数调用是本地的,哪个是远程的。

记录您的系统。使组件之间的依赖关系变得清晰。

处理错误案例。当RPC服务器长时间停机时,客户端应该如何反应?

如有疑问,请避免使用RPC。如果可以,您应该使用异步管道 - 而不是类似RPC的阻塞,将结果异步推送到下一个计算阶段。

回调队列

一般来说,通过RabbitMQ进行RPC很容易。客户端发送请求消息,服务器回复响应消息。为了接收响应,我们需要发送带有请求的“回调”队列地址。我们可以使用默认队列。我们来试试吧:

list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

$msg = new AMQPMessage($payload,array('reply_to' => $queue_name));
$channel->basic_publish($msg, '', 'rpc_queue');

# ... 然后代码从callback_queue中读取响应消息...

消息属性

AMQP协议预定义了一组带有消息的14个属性。大多数属性很少使用,但以下情况除外:

delivery_mode:将消息标记为持久性(值为2)或瞬态(1)。你可能还记得第二篇教程中的这个属性。

content_type:用于描述编码的mime类型。例如,对于经常使用的JSON编码,将此属性设置为:application / json是一种很好的做法。

reply_to:通常用于命名回调队列。

correlation_id:用于将RPC响应与请求相关联。