跳至主内容

RabbitMQ 教程 - 远程过程调用 (RPC)

远程过程调用 (RPC)

(使用 AMQP 1.0 .NET 客户端)

信息

先决条件

本教程假设 RabbitMQ 已 安装 并在 localhost 上的 标准端口 (5672) 上运行。如果您使用不同的主机、端口或凭据,则需要调整连接设置。

哪里寻求帮助

如果您在学习本教程时遇到困难,可以通过 GitHub DiscussionsRabbitMQ 社区 Discord 联系我们。

上一篇教程中,我们使用了主题交换机 (topic exchanges)。在本教程中,我们将实现请求/回复 (RPC) 模式:客户端发送一个请求并等待响应。

示例 RPC 服务将在服务器上计算斐波那契数列。服务器在仲裁队列 (quorum queue) rpc_queue 上使用 IResponder;客户端使用 IRequester 发布请求并等待回复。

服务器 (RPCServer)

IResponder responder = await connection.ResponderBuilder()
.RequestQueue(rpcQueueName)
.Handler((ctx, request) =>
{
string response = "";
try
{
string message = Encoding.UTF8.GetString(request.Body()!);
int n = int.Parse(message);
Console.WriteLine($" [.] fib({message})");
response += Fib(n);
}
catch (Exception e)
{
Console.WriteLine($" [.] {e.Message}");
}

return Task.FromResult(ctx.Message(Encoding.UTF8.GetBytes(response)));
})
.BuildAsync();

客户端 (RPCClient)

IRequester requester = await connection.RequesterBuilder()
.RequestAddress()
.Queue("rpc_queue")
.Requester()
.BuildAsync();

IMessage request = new AmqpMessage(Encoding.UTF8.GetBytes(iStr));
IMessage reply = await requester.PublishAsync(request);

本教程的客户端在循环中请求 fib(0)fib(31),这与其他 AMQP 1.0 教程的端口保持一致。

运行

dotnet run --project RPCServer/RPCServer.csproj
dotnet run --project RPCClient/RPCClient.csproj

源码

关于 RPC 的说明

RPC 虽然常见但很容易被误用:请明确区分哪些调用是本地调用,哪些是远程调用,记录好依赖关系,并妥善处理代理或服务器故障。如有疑问,请优先选择异步流水线而不是阻塞式 RPC。

有关 AMQP 1.0 和 RabbitMQ 的更多信息,请参阅 RabbitMQ 中的 AMQPAMQP 1.0 客户端库

© . This site is unofficial and not affiliated with VMware.