RabbitMQ 教程 - RPC
RPC
(使用 AMQP 1.0 Go 客户端)
先决条件
本教程假设 RabbitMQ 已 安装 并在 localhost 上的 标准端口 (5672) 上运行。如果您使用不同的主机、端口或凭据,则需要调整连接设置。
哪里寻求帮助
如果您在学习本教程时遇到困难,可以通过 GitHub Discussions 或 RabbitMQ 社区 Discord 联系我们。
在上一篇教程中,我们学习了如何使用主题交换机(topic exchanges)在分布式系统中广播消息。
在本教程中,我们将做一些完全不同的事情——我们将使用 RabbitMQ 实现请求/响应模式。当您需要在进程之间进行远程过程调用时,这非常有用。我们将展示如何使用 RabbitMQ 进行 RPC 调用。
我们的 RPC 系统将由一个客户端和一个可扩展的 RPC 服务器组成。我们不会使用 JSON,而是通过对一个函数编号进行编码,并使用该编号来决定在 RPC 服务器上调用哪个函数。
远程过程调用实现
如果你查看之前的教程,每个教程程序都是相当独立的,不依赖于其他任何东西。在这一篇中,我们将编写两个程序:一个调用远程函数的客户端和一个实现远程函数的服务器。
RPC 服务器
服务器公开了一个我们可以调用的函数——它计算斐波那契数列。
go run rpc_server.go
# => [x] Awaiting RPC requests
服务器处理来自名为 rpc_queue 的队列的请求。实现细节请参阅完整的 rpc_server.go。
RPC 客户端
客户端发送一个请求并等待响应。
go run rpc_client.go 30
# => [x] Requesting fib(30)
# => [.] Got 832040
客户端将请求发送到 rpc_queue,服务器在回复队列上进行响应。实现细节请参阅完整的 rpc_client.go。
设计模式
RPC 模式的工作原理如下:
- 客户端发送一个带有
reply_to地址的请求消息,并在该地址等待响应。 - RPC 工作者(服务器)执行工作并将响应发送到
reply_to队列。 - 客户端接收响应并处理它。
rabbitmq-amqp-go-client 使用管理 API 来声明队列,并使用消费者/发布者 API 来发送/接收消息,从而处理消息流。
关联 ID (Correlation IDs)
在实现中,每个 RPC 请求都包含一个关联 ID。这个 ID 会在响应中原样返回,以便客户端可以在有多个并发 RPC 调用时,将请求与响应进行匹配。
总而言之
完整的代码示例可在以下位置获取:
要尝试此操作,请启动 RPC 服务器:
go run rpc_server.go
# => [x] Awaiting RPC requests
并在另一个终端中调用 RPC 函数:
go run rpc_client.go 10
# => [x] Requesting fib(10)
# => [.] Got 55
RPC 模式演示了 RabbitMQ 如何用于分布式系统中的同步请求/响应通信,这补充了之前教程中展示的异步模式。
恭喜!我们已经涵盖了使用 AMQP 1.0 的 RabbitMQ 消息传递模式的基础知识。有关更多高级主题,请参阅 RabbitMQ 文档 和 AMQP 1.0 客户端库。