基于AMQP实现RPC(Remote Procedure Call)的设计

基于AMQP实现RPC(Remote Procedure Call)的设计
guibin.beigjing@gmail.com

首先回忆一下RPC的过程。客户端将请求发送给服务器端,服务器端处理完毕之后将结果返回给客户端。那么在AMQP之上,如何实现RPC呢?客户端应当将请求publish给服务器端,服务器处理完毕之后,再将结果publish回给客户端。在这过程中有两次publish,显然应该是不同的publish。服务器端publish的消息,客户端不应该收到更不应该消费;给客户端publish的结果消息,应该只有客户端能收到;并且对于每次请求和相应,都应该有一组唯一的标识,标识并匹配相应的一对请求和响应,防止由于多次请求而收到多次响应,混淆了请求和响应之间的对应关系。

基于AMQP实现RPC的逻辑如下图所示:
[img]http://dl.iteye.com/upload/attachment/421822/d212cdd3-5ab5-3e35-85c0-830f9799c706.png[/img]

[list]
[*]服务器S提前建好一个专门接受来自客户端RPC请求的队列rpc_queue,并且客户端知道如何向此队列publish消息的rountingKey。通常情况下会建立一个和该接受请求的队列同名的rountingKey,并和该rpc_queue绑定。这样客户端向rountingKey发送请求后,服务器端就能收到请求了。
[*]当客户端C启动的时候,生成一个匿名的、排他的、自动删除的回调队列(an anonymous, exclusive and auto delete callback queue),用来接受来自服务器端的响应。
[*]对于一个PRC请求而言,客户端发送的消息必须包含两个属性“ reply_to”和“ correlation_id”。“reply_to”用来告诉服务器端计算后的结果发送到哪个rountingKey,“correlation_id”用做每个请求的唯一标识,以区分不同请求和不同响应。
[*]客户端C将请求publish到rpc_queue,图中上面从左向右的过程。
[*]服务器端S在监听队列rpc_queue,收到了来自客户端的请求之后,处理并得到结果,将结果包装成响应消息,publish给“reply_to”。
[*]客户端C一直在监听“reply_to”队列,收到了结果消息后,取到消息中的属性“correlation_id”值,如果这个“correlation_id”和之前记录的请求的“correlation_id”相匹配,则确认这个响应是有效的,并将结果返回给调用者。[/list]

基于此设计,用Scala+RabbitMQ的实现源代码,请参考[url=https://github.com/dcaoyuan/aiotrade]AIOTrade[/url]中的lib.amqp包下的[url=https://github.com/dcaoyuan/aiotrade/blob/master/libs/lib.amqp/src/main/scala/org/aiotrade/lib/amqp/RpcClient.scala]RpcClient.scala[/url]和[url=https://github.com/dcaoyuan/aiotrade/blob/master/libs/lib.amqp/src/main/scala/org/aiotrade/lib/amqp/RpcServer.scala]RpcServer.scala[/url]。

参考文献:
[url]http://www.rabbitmq.com/tutorial-six-python.html[/url]
[url]http://www.infoq.com/articles/AMQP-RabbitMQ[/url]

Guibin
2011-02-20
AMQP-CPP:C ++库,用于与RabbitMQ进行异步非阻塞通信 AMQP-CPP 您是否要从AMQP-CPP 3升级到AMQP-CPP 4? AMQP-CPP是用于与RabbitMQ消息代理进行通信的C ++库。 该库可用于解析来自RabbitMQ服务器的传入数据,并生成可发送到RabbitMQ服务器的帧。 该库具有分层的体系结构,并且允许您(如果您愿意)完全照顾网络层。 如果您想自己设置和管理网络连接,AMQP-CPP库将不会自行与RabbitMQ建立连接,也不会创建套接字和/或执行IO操作。 作为该库的用户,您可以创建套接字连接并实现特定的接口,该接口将传递给AMQP-CPP库,并且该库将用于IO操作。 但是,拦截此网络层是可选的,AMQP-CPP库还带有预定义的TCP和TLS模块,如果您信任AMQP库来处理网络(和可选的TLS),则可以使用该模块。 在这种情况下,AMQP-CPP库执行所有系统和库调用,以建立网络连接并发送和接收(可能是加 立即下载

相关推荐

Win11注册表没有MMC的解决方法

本文详细介绍了在Win11系统中解决注册表没有MMC项的问题的方法。通过创建并导入注册表修复文件,我们可以成功地在注册表中添加缺失的MMC项。在操作过程中,需要注意备份注册表、以管理员身份运行工具以及系统更新等事项。希望本文能够帮助到遇到类似问题的用户,提高系统管理的效率和便捷性。如果你还有其他关于Windows操作系统的问题或疑问,欢迎随时提问并寻求帮助。

nntxthml的博客 1552

RPC远程调用概念 && demo实例

RPC是指远程过程调用,直观说法就是A通过网络调用B的过程方法。也就是说两台serverA。B,一个应用部署在Aserver上,想要调用Bserver上应用提供的函数/方法,因为不在一个内存空间,不能直接调用。须要通过网络来表达调用的语义和传达调用的数据。 为什么RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完毕的需求,比方比方不同的系统间的通讯,...

weixin_34112208的博客 173

集成库仑计移动电源设计:从原理到实战,实现精准电量管理

在电池供电设备中,精准的电量计量是提升用户体验和产品可靠性的核心技术。传统基于电压估算的方法因受温度、负载和老化影响误差较大,而库仑计技术通过直接测量充放电电流并对时间积分,实现了电荷量的直接计量,从根本上提升了精度。这项技术的核心价值在于为设备提供了真实、可靠的电量状态数据,是智能电池管理系统的基础。其应用场景广泛,从消费电子如移动电源、智能穿戴,到工业与汽车领域如储能系统、新能源汽车的电池管理都不可或缺。本文以移动电源为例,深入解析了集成库仑计方案的硬件设计要点,特别是围绕高精度采样电阻与差分放大器的电

weixin_33453726的博客 548

RPMsg:协议简介

RPMsg:协议简介 本篇文章转载于https://www.jianshu.com/p/c7cdad8273ed,在此做个备份,方便查阅 在此感谢原博主***SunnyZhou1024*** RPMsg:协议简介0. 起因1. AMP2. RPMsg2.1. Linux中的RPMsg2.2. 原理2.3. 协议3. API4.4. References 0. 起因 之前在RPC原理与FastRPC实现一文中介绍过RPC的原理,简而言之,RPC就是实现本地程序调用位于另一个地址空间的例程(routine

李易达 的博客 1万+

Cadence OrCAD: 层次化设计 Hierarchical Design

详细介绍OrCAD的原理图层次化设计方法。

Fantasy237的博客 1万+

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 196

RabbitMQ C Master 使用记录之C/C++ RPC远程调用

RabbitMQ C Master 使用记录之RPC远程调用 经过查询,目前没有在主流的博客或者论坛中找到C/C++中使用RPC的内容,并且官方的文档并不是很详细,示例代码中也仅仅发现了amqp_rpc_sendstring_client.c的文档,并没有server端的代码,再写server端程序的时候遇到各种问题,解决完后以此文记录下来,解决问题的过程中参考了RPC-Java和Python的官...

霊昱的博客 1059

anaconda navigator 卡在loading application界面一直没有反应解决办法

在打开anaconda navigator 程序的时候,遇到了2个问题。第一个问题:打开的时候弹出提示:There is an instance of Anaconda Navigator already running.第二个问题:程序一直卡在loading application界面一直没有反应。以下是我的解决办法,有效果。

猿小白的博客 4383

RabbitMQ教程之php-amqplib(七)远程调用

远程调用 PRC(Remote procedure Call) using php-amqplib 在第二节教程中,我们知道了怎样使用工作队列将耗时的任务分发给多个消费者。但是,如果我们需要在远程计算机上运行并等待结果怎么办?那样就是一个新的应用场景。这种模式通常称为远程调用或者叫 PRC。在本教程中,我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩展的RPC服务器。由于我们没

demon的专栏 4138

model_optimizer将pi05端到端延时进一步优化到68.13ms了

目前在保持灵活性和性能之间找到一个较好的平衡。vit, llm仍然使用onnx->trt_engine的路径,量化可以通过https://github.com/NVIDIA/Model-Optimizer.git支持。同时支持通过cutedsl手写算子进行进一步优化denoise因为步数多,kernel launch多,因此完全通过手写融合算子实现,将所有steps进行一次大的cuda graph capture.

happyAnger6的专栏 59

华为OD机考2025C卷 - 高矮个子排队(Java & Python& JS & C++ & C)

华为OD机考2025C卷 - 高矮个子排队。提供在线OJ刷题。Java、C++、Python、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1681

RabbitMQ学习(六):Remote procedure call

说明 通过前面五篇教程,我们已经学习了RabbitMQ的基本使用方法,了解了RabbitMQ的消息派发方式,消息的持久化,消息确认机制… 通过简单的程序,对RabbitMQ的消息传递模型有了初步了解,学习了Fanout,Direct,Topic三种类型交换机的使用,明白了消息路由的实现机制。本篇教程将继续翻译官方的第六篇教程RPC,学习如何通过RabbitMQ实现远程过程调用。 正文 在第二篇教程...

wds的博客 907

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Remote Procedure Call(RPC)

 In the second tutorial we learned how to use Work Queues to distribute time-consuming tasks among multiple workers. But what if we need to run a function on a remote computer and wa

wilsonke的专栏 1657

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RabbitMQ--Remote procedure call (RPC)(六)

远程过程调用(RPC) 我们学习了如何使用工作队列在多个工作人员之间分配耗时的任务。 但是如果我们需要在远程计算机上运行功能并等待结果怎么办?那是一个不同的故事。此模式通常称为远程过程调用或RPC。 在本教程中,我们将使用RabbitMQ构建一个RPC系统:一个客户端和一个可扩...

289

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

rabbitmq(六)RPC(Remote procedure call,远程过程调用)

rabbitmq RPC工作流程客户端向远端发送请求时需要设置两个重要的属性:callback queue(回调队列)和correlation id(关联id)。远端响应客户端的请求时会将结果投递到该回调队列,并且也会附上客户端发送请求时设置的关联id,这样客户端就能通过远端响应的关联id和自身生成的关联id是否相等来判断是否是对该客户端的响应。设置好这两个请求属性后,就可以将消息投递到请求队列了。

g110029017的专栏 595

Remote procedure call (RPC)

Remote procedure call (RPC) (using the .NET client)   Prerequisites This tutorial assumes RabbitMQ isinstalled and running on localhoston standard port (5672). In case you use a different host, ...

weixin_34019144的博客 244

Rabbitmq教程翻译(六)Remote procedure call (RPC)远程过程调用

远程过程调用(RPC) (使用Java客户端) 在第二个教程中,我们学会了如何使用工作队列分发在多个工作者耗时消费的任务。 但是,如果我们需要在远程计算机上运行的功能,并等待结果?嗯,这是一个不同的故事。这种模式通常被称为远程过程调用RPC。 在本教程中,我们要使用RabbitMQ的构建RPC系统:一个客户端和一个可扩展的RPC服务器。正如我们没有任何耗时的任务,是值得分发,我

sully2008的专栏 3398

RabbitMQ入门教程 For Java【6】 - Remote procedure call (RPC)

RabbitMQ入门教程 For Java【6】 - Remote procedure call (RPC) 本教程中,我们将学习使用工作队列让多个消费者端来执行耗时的任务。比如我们需要通过远程服务器帮我们计算某个结果。这种模式通常被称之为远程方法调用或RPC. 我们通过RabbitMQ搭建一个RPC系统,一个客户端和一个RPC服务器,客户端有一个斐波那契数列方面的问题需要解决(Fibonac

大大的微笑的专栏 6739

从拒绝采样到期望优化:用 Rand7 实现 Rand10 的 LeetCode 470 全解析

在算法与概率论的交汇处,随机数生成器构造问题一直是对均匀性理解的试金石。当我们手中只有一个等概率返回值的基础随机源时,如何扩展其范围并保持分布特性?拒绝采样给出了通用答案:通过组合独立随机变量扩大等概率样本空间,再截取目标区间的整数倍部分,能确保每个输出值出现次数完全一致。这一技术的价值不仅限于刷题,在蒙特卡洛模拟、统计学抽样、密码学随机化等领域都有广泛应用。从最初朴素的期望调用次数2.45,到利用被拒绝样本映射为Rand9、Rand3的进一步优化,可以将期望降至2.19。本文以 LeetCode 470

weixin_34348805的博客 316

Nova中的RPC讲解

一 注册过程Nova中各个服务之间使用了基于AMQP实现的RPC机制,其中nova-compute、nova-conductor和nova-scheduler在启动时都会注册一个RPC Server,而nova-api因为Nova内部没有服务会调用它提供的接口,所以无需注册。以nova-compute服务为例:nova/compute/rpcapi.py class ComputeAPI(obje...

实践求真知 1211

RabbitMQ RPC(Remote procedure call) 云计算集群的远程调用

本系列教程主要来自于官网入门教程的翻译,然后自己进行了部分的修改与实验,内容仅供参考。 官网地址  https://www.rabbitmq.com/tutorials/tutorial-six-java.html 在第二个教程中我们学习了如何使用工作队列分配耗时的任务在多个工人。 但是,如果我们需要在远程计算机上运行一个函数并等待结果?嗯,这是一个不同的故事。这种模式是俗称asRe

Technology Share 787

Remote procedure call (RPC) 官网server代码翻译及说明

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34268610的博客 199

译:6.RabbitMQ Java Client 之 Remote procedure call (RPC,远程过程调用)

在  译:2. RabbitMQ 之Work Queues (工作队列)  我们学习了如何使用工作队列在多个工作人员之间分配耗时的任务。 但是如果我们需要在远程计算机上运行一个函数并等待结果呢?嗯,这是一个不同的故事。此模式通常称为远程过程调用或RPC。 在本教程中,我们将使用RabbitMQ构建RPC系统:客户端和可伸缩的RPC服务器。由于我们没有任何值得分发的耗时任务,我们将创建一个返回F...

weixin_34081595的博客 114

RabbitMQ(8)Java Client - Remote Procedure Call(RPC)

RabbitMQ(8)Java Client - Remote Procedure Call(RPC) We need to run a function on a remote computer and wait for the result. This pattern is commonly known as Remote Procedure Call or RPC. Callba...

快马扬鞭须努力! 225

官网英文版学习——RabbitMQ学习笔记(八)Remote procedure call (RPC)

在第四篇学习笔记中,我们学习了如何使用工作队列在多个工作者之间分配耗时的任务。但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?这是另一回事。这种模式通常称为远程过程调用或RPC。在本篇学习笔记中,我们将使用RabbitMQ构建一个RPC系统:客户机和可伸缩的RPC服务器。由于我们没有任何值得分发的耗时任务,所以我们将创建一个返回斐波那契数的虚拟RPC服务。我们的RPC将这样工作:当客户端...

zuixiaoyao_001的博客 302
上一篇: Maven的常用技巧总结
下一篇: Erlang 学习笔记(一)
Guibin
博客等级 码龄23年 45粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值