-
Notifications
You must be signed in to change notification settings - Fork 22
RabbitMQ Remote procedure call (RPC)
L edited this page Jun 7, 2019
·
2 revisions
Request/reply pattern example
请求/回复模式示例
需要在远程计算机上运行一个函数并等待结果, 此模式通常称为远程过程调用或RPC
使用RabbitMQ构建RPC系统:客户端和可伸缩的RPC服务器。 由于我们没有任何值得分发的耗时任务,我们将创建一个返回Fibonacci数字的虚拟RPC服务
RPC将这样工作:
当客户端启动时,它会创建一个匿名的独占回调队列
对于RPC请求,客户端发送带有两个属性的消息:ReplyTo(设置为回调队列)和CorrelationId(设置为每个请求的唯一值)
请求被发送到rpc_queue队列
RPC worker(aka:server)正在等待该队列上的请求。 当请求出现时,它会执行作业并使用ReplyTo属性中的队列将结果返回给客户端
客户端等待回调队列上的数据。 出现消息时,它会检查CorrelationId属性。 如果它与请求中的值匹配,则将响应返回给应用程序
尽管RPC在计算中是一种非常常见的模式,但它经常受到批评。 当程序员不知道函数调用是本地的还是慢的RPC时,会出现问题。 这样的混淆导致系统不可预测,并增加了调试的不必要的复杂性。 错误使用RPC可以导致不可维护的意大利面条代码,而不是简化软件
考虑到这一点,请考虑以下建议:
确保明显哪个函数调用是本地的,哪个是远程的。
记录您的系统。 使组件之间的依赖关系变得清晰。
处理错误案例。 当RPC服务器长时间停机时,客户端应该如何反应?
如有疑问,请避免使用RPC。 如果可以,您应该使用异步管道 - 而不是类似RPC的阻塞,将结果异步推送到下一个计算阶段。