IPC 和 RPC 是不同层面的通信概念。IPC 解决的是本地多进程如何协作通信的问题,是操作系统提供的基础机制,比如管道、消息队列和最快的共享内存。而 RPC 解决的是分布式系统下如何透明地调用远程服务的问题,它是一种高层设计模式,通常需要序列化、网络传输等服务发现等组件支持。
RPC 的目标是让开发者感觉像调用本地函数一样简单,但其内部复杂得多,需要处理网络的各种不确定性。虽然它们的目标不同,但在某些场景下也有交集,例如,我们可以使用一种高效的 IPC(如 Unix Domain Socket)作为同一台机器上两个服务之间进行 RPC 通信的传输层,以提升性能。
IPC (Inter-Process Communication, 进程间通信)
指的是在同一台机器上运行的多个进程之间交换数据或信号的机制。它解决的是本地多进程协作的问题。
常见技术方式:
管道 (Pipe) / 命名管道 (Named Pipe, FIFO)
管道:单向通信,用于有亲缘关系的进程(如父子进程)。
命名管道:有名字的管道,可用于无亲缘关系的进程。
信号 (Signal)
用于异步通知进程某个事件已发生(如
SIGKILL,SIGINT)。处理简单,但携带的信息量少。
消息队列 (Message Queue)
消息的链表,存储在内核中。进程可以放入或取出消息。克服了管道字节流模型的缺点。
共享内存 (Shared Memory)
最快的 IPC 方式。多个进程将同一块物理内存映射到自己的虚拟地址空间,从而直接读写。需要配合信号量或互斥锁等同步机制来避免数据竞争。
信号量 (Semaphore) & 互斥锁 (Mutex)
主要用于进程间的同步,控制对共享资源的访问,而不是直接用于传递数据。常作为共享内存的配套技术。
套接字 (Socket)
虽然 Socket 最常用于网络通信,但也有本地套接字 (Unix Domain Socket),用于同一台主机上的进程间通信,效率比网络套接字高。
RPC (Remote Procedure Call, 远程过程调用)
是一种跨网络的通信机制,它允许一台机器上的程序调用另一台机器上的子程序(或服务),就像调用本地方法一样,对开发者屏蔽了底层的网络复杂性。它解决的是分布式系统间调用的问题。
一个 RPC 调用主要经历以下流程,其核心目标是让客户端像调用本地函数一样调用远程服务:

常见 RPC 框架:
gRPC (Google):基于 HTTP/2 和 protobuf,高性能,跨语言。
Apache Thrift (Facebook):跨语言,功能全面。
Dubbo (阿里巴巴):Java 生态的高性能 RPC 框架。
.brpc (百度):C++ 生态的高性能 RPC 框架。
评论区