基于Rabbit实现的RPC
最近在学习项目中的通用技术,其中一个是在项目中会经常使用的基于RabbitMQ实现的RPC。这里一共有三个点要学习,分别是:RPC是什么?RabbitMQ是什么?如何使用RabbitMQ实现RPC。奔着这三个目标,查阅了资料。做笔记记录。
RPC
rpc的全称叫:远程过程调用,可以通俗的理解为通过网络调用另一台电脑上的函数的业务处理思想。首先,我们先看看本地的函数调用流程是怎样。
本地调用:
本地调用当执行到sum=fun(2,3)时,程序会在内存中查找函数指针fun,然后带着参数进入fun()函数中运算,最后返回给sum_main。如果是远程调用,则是从一个电脑A上调用另一个电脑B上的函数。
RPC思想的好处是:
1、更符合编程思想。想要实现什么功能直接调用相应的函数,这是编程最直接的思想。
2、减少代码重复率。A想实现的功能如果B中已经实现了,那么A就直接调用B的函数,避免自己再重复实现。
RPC调用:
rpc多使用http传输请求,格式有xml,json等,这里是xml。如下是使用python中自带的RPC调用框架来实现的一个最简单的RPC调用。
client.py
server.py
先启动服务器端
后启动客户端
这样就完成了一次RPC调用。RPC的调用流程如下图所示。调用流程是:
- client调用以本地调用方式调用服务;
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;
- client stub找到服务地址,并将消息发送到服务端;
- server stub收到消息后进行解码;
- server stub根据解码结果调用本地的服务;
- 本地服务执行并将结果返回给server stub;
- server stub将返回结果打包成消息并发送至消费方;
- client stub接收到消息,并进行解码;
- 服务消费方得到最终结果。
RabbitMQ
RabbitMQ是实现了AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的软件。主要功能是
- 解耦服务。使用rabbitmq可以将自个服务解耦,实现模块化
- 扩展性高。系统中增加一项功能不需要 从头开始,自需要增加模块即可
- 解决高并发瓶颈。消息队列具有缓存消息功能,能够有效解决高并发请求。
以下摘录自知乎:
1 2 3 4 5 6 7 8 9 | 对于初学者,举一个饭店的例子来解释这三个分别是什么吧。不是百分百恰当,但是应该足以解释这三者的区别。 RPC:假设你是一个饭店里的服务员,顾客向你点菜,但是你不会做菜,所以你采集了顾客要点什么之后告诉后厨去做顾客点的菜, 这叫RPC(remote procedure call),因为厨房的厨师相对于服务员而言是另外一个人(在计算机的世界里就是remote的机器上的一个进程)。 厨师做好了的菜就是RPC的返回值。 任务队列和消息队列:本质都是队列,所以就只举一个任务队列的例子。假设这个饭店在高峰期顾客很多,而厨师只有很少的几个, 所以服务员们不得不把单子按下单顺序放在厨房的桌子上,供厨师们一个一个做,这一堆单子就是任务队列(当然,取决于问题的语境, 可能要把放订单的桌子也算在里面一起构成所谓的任务队列平台),厨师们每做完一个菜,就从桌子上的订单里再取出一个单子继续做菜。 |
简单消息队列:
最简单的消息队列,生产者-消费者模式。一端产生消息,发送到队列,另一端消费者收取消息。
consume_simple.py
productor_simple.py
先运行消费者
在运行生产者
观察消费者获取的消息
RabbitMQ实现RPC
RPC的要求是等待获得返回值,而RabbitMQ常出现的场景是异步等待。这就要求RabbitMQ可以立即返回结果。使用了两种技术:
一、为调用指明id,要求id和结果一起返回,使用id来判断是哪一个函数的调用返回;
二、指明返回的队列名,返回结果时指明返回队列的名字确保会正确返回到调用者。
工作流程:
- 客户端创建message时指定reply_to队列名、correlation_id标记调用者。
- 通过队列,服务端收到消息。调用函数处理,然后返回。
- 返回的队列是reply_to指定的队列,并携带correlation_id。
- 返回消息到达客户端,客户端根据correlation_id判断是哪一个函数的调用返回。
__EOF__

本文链接:https://www.cnblogs.com/goldsunshine/p/8665456.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理