IPC 和 RPC,有什么区别?

IPC 和 RPC 经常一起出现,但它们解决的不是同一个问题。

最简单的区分是:

IPC 解决进程之间怎么传数据,RPC 解决怎样把数据交换包装成一次函数调用。

IPC:进程间通信

IPC 是 Inter-Process Communication,也就是进程间通信。

不同进程拥有各自独立的内存,不能直接读取对方的变量。它们要交换数据,需要借助操作系统提供的通信机制,例如:

  • Unix Domain Socket
  • 匿名管道、命名管道
  • 共享内存
  • 消息队列

IPC 关心的是:

text 复制代码
一段数据怎样从进程 A 到达进程 B?

它通常不关心数据表达的是查询、写入,还是一次业务操作。

RPC:远程过程调用

RPC 是 Remote Procedure Call,也就是远程过程调用。这里的"远程"不一定是另一台机器,也可以是本机的另一个进程。

RPC 会把底层通信包装成类似函数调用的形式:

js 复制代码
const user = await userService.getUser(42);

底层实际发生的过程通常是:

  1. 客户端生成请求 ID;
  2. 序列化方法名和参数;
  3. 通过 IPC 或网络发送请求;
  4. 服务端找到对应方法并执行;
  5. 服务端返回结果或错误;
  6. 客户端根据请求 ID 找到对应调用。

例如,一条 JSON-RPC 请求可能是:

json 复制代码
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getUser",
  "params": { "id": 42 }
}

两者是什么关系?

RPC 通常运行在某种 IPC 或网络通道之上。

text 复制代码
RPC 方法调用
    ↓
序列化和消息分帧
    ↓
IPC 或网络通道
    ↓
另一个进程或服务

假设两个本机进程通过 Unix Domain Socket 传输 JSON-RPC 消息:

  • 从传输角度看,它使用了 IPC;
  • 从调用语义看,它进行的是 RPC。

这两种说法都对,只是描述的层次不同。

可以把它们类比为:

text 复制代码
IPC = 公路
RPC = 公路上运行的快递系统

公路负责把东西运过去;快递系统还定义收件人、运单号、交付结果和异常处理。

服务之间的通信都是 RPC 吗?

不是。

同步的请求---响应调用通常具有 RPC 语义,但服务之间还可以通过其他方式通信:

  • 消息队列
  • 发布订阅
  • 事件通知
  • 持续数据流

这些方式不一定要求调用某个明确的方法,也不一定等待对应的返回值。

RPC 不等于本地函数调用

RPC 看起来像函数调用,但它还会遇到本地调用没有的问题:

  • 请求超时;
  • 连接中断;
  • 服务不可用;
  • 请求已经执行,但响应丢失;
  • 重试导致重复执行。

因此设计 RPC 接口时,除了方法和参数,还要考虑超时、重试、幂等、取消和鉴权。

总结

只要记住两句话:

IPC 描述数据怎么在进程之间传输。

RPC 描述如何把这次数据交换组织成方法调用。

Unix Domain Socket、Pipe 属于 IPC 手段 ;JSON-RPC、gRPC 属于 RPC 方案。RPC 可以建立在 IPC 之上,两者并不冲突。

相关推荐
实名上网宋凯宣8 小时前
Django
后端·python·django
利威尔xu10 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
逃逸线LOF10 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
慢云智慧空间11 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu11 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
薛定谔的猫-菜鸟程序员11 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
IT_陈寒13 小时前
SpringBoot多环境配置把我坑惨了,这个踩坑经验你最好看看
前端·人工智能·后端
码事漫谈13 小时前
DeepSeek 搞了个 "Super-agent",但不是超级智能
后端
吴凡wudianmei14 小时前
从 0 搭一个 AI Agent(四):SSE 跑通之后,三处“契约错配”与它们的修复边界
前端·后端·aigc
小兔子14 小时前
defer 的参数在写下那一刻就求值了,循环里这样写会踩坑
后端