知识卡片

RPC的三个基本问题都是本地方法调用的跨进程投影

结构图卡

内容

所有RPC协议归根结底都在解决同三个问题,而这三个问题在本地方法调用里本来 都不是问题,只是跨进程后才浮现出来。如何表示数据:本地调用靠语言内置类型 就能传参和取返回值,跨进程后双方可能语言不同、硬件字节序不同,必须靠序列化 /反序列化把数据转成中立格式(ONC RPC的XDR、gRPC的Protocol Buffers、JSON 等)。如何传递数据:本地调用靠栈内存直接完成,跨进程后要通过网络在两个 Endpoint间交换数据,这套”交换协议”叫Wire Protocol(如JRMP、IIOP、SOAP, 或直接复用HTTP)。如何表示方法:本地调用靠编译器把方法签名转换成入口地址 指针,跨进程后不同语言的方法签名形式各异,需要一套与语言无关的标准来定位 方法(如DCE/RPC干脆用绝不重复的UUID编号,或用接口描述语言IDL,如CORBA的 OMG IDL、Web Service的WSDL)。理解”三个问题都是本地调用某个环节被拆开后 重新解决”这个类比,比死记每种协议的具体方案更有迁移价值。

结构图

flowchart LR
    subgraph 本地方法调用
        L1[语言内置数据类型]
        L2[栈内存直接传递]
        L3[编译期解析入口指针]
    end
    subgraph 跨进程后浮现的问题
        R1[如何表示数据]
        R2[如何传递数据]
        R3[如何表示方法]
    end
    L1 -->|语言/字节序不通用| R1
    L2 -->|无共享内存| R2
    L3 -->|签名形式各异| R3
    R1 -->|序列化协议: XDR/Protobuf/JSON| S1[中立数据格式]
    R2 -->|Wire Protocol: JRMP/IIOP/SOAP/HTTP| S2[网络交换协议]
    R3 -->|IDL/UUID编号: OMG IDL/WSDL| S3[跨语言方法定位标准]

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第2章"访问远程服务"2.1.3节 "三个基本问题"(源文件:_epub-src对应OEBPS/Text/chapter16.xhtml) - 结论依据:原文明确指出"以上RPC中的三个基本问题,全部都可以在本地方法 调用过程中找到对应的解决方案",并逐一列举各协议在数据表示、数据传递、 方法表示三方面的具体方案,直接支撑本卡片的类比结构。 - 原始内容:以上RPC中的三个基本问题,全部都可以在本地方法调用过程中找到 对应的解决方案。RPC的设计始于本地方法调用……抓住两者间的联系来类比,对 我们更深刻地理解RPC的本质会很有帮助。