认识 RPC 的不同模式
文章目录0.前言1.核心 RPC 模式对比2.模式详解2.1 同步模式 (Request-Reply)2.2 异步模式 (Future/Promise)2.3 单向调用 (One-way)2.4 回调模式 (Callback)3.如何选择4.补充阅读参考文献0.前言远程过程调用RPCRemote Procedure Call的核心思想是让调用远程服务像调用本地函数一样自然。但在工程实践中根据不同的业务需求和技术场景RPC 演化出了多种实现模式。这里整理了四种最核心的模式可以帮助你建立一个清晰的认知框架。1.核心 RPC 模式对比这四种模式各有侧重简单来说同步模式和异步模式解决的是通信的效率问题而单向调用和回调模式解决的是通信的交互形式问题。模式核心机制特点适用场景同步模式请求-响应阻塞等待实现简单、逻辑直观但客户端必须等待可能造成线程阻塞。普通Web后端、BFF层、读写数据库等大部分常规业务。异步模式基于 Future/Promise非阻塞高吞吐、资源利用率高但编程模型相对复杂。高并发服务、IO密集型任务、调用链较长的场景。单向调用请求-only无需响应客户端发送后即返回开销极小可靠性低无法感知服务端状态。日志上报、监控指标采集、非关键通知。回调模式双向异步结果通知适合长时任务客户端无需轮询实现复杂需要额外处理回调。AI推理任务、报表生成、订单异步处理。2.模式详解2.1 同步模式 (Request-Reply)这是最基础的RPC模式由 Birrell 和 Nelson 在 1984 年的经典论文中首次系统阐述 [1]。客户端发起调用后线程会阻塞一直等待服务器返回结果或超时才继续执行。// 客户端代码会在此等待1秒钟直到服务端返回结果ResponseresrpcClient.send(request);它最大的优点是编程模型简单符合直觉在大部分业务逻辑简单的场景如HTTP调用、数据库操作是首选。缺点是当服务端处理慢时客户端线程会被长时间占用影响系统整体吞吐量。2.2 异步模式 (Future/Promise)客户端发起调用后会立即返回一个Future或Promise对象不会阻塞当前线程。你可以在稍后通过这个对象获取最终结果。Ananda 等人于 1992 年发表了关于异步 RPC 的系统性综述 [2]对这一模式进行了详细分类。FutureResponsefuturerpcClient.asyncSend(request);// 这里可以做别的事情不阻塞doOtherThings();// 最后再尝试获取结果如果未完成则阻塞等待Responseresfuture.get();这种模式能有效提升系统的并发能力非常适合IO密集型或服务调用链较长的场景。2.3 单向调用 (One-way)客户端发送请求后完全不关心服务端是否收到或如何处理立刻返回。这是最轻量级的模式几乎没有响应开销。// 调用发出后立刻返回不等待任何响应rpcClient.onewaySend(logRequest);适用于日志上报、监控打点等可靠性要求不高、但对性能有极致要求的场景。2.4 回调模式 (Callback)这是异步模式的一种实现。客户端发起调用时会附带一个回调函数。当服务端处理完成并返回结果时这个回调函数会被自动触发。rpcClient.asyncSend(request,newCallback(){publicvoidonSuccess(Responseres){handle(res);}publicvoidonFailure(Throwablet){handleError(t);}});// 调用发出后立刻返回不阻塞doOtherThings();这种方式在GUI编程和JavaScript中非常常见。在RPC中它非常适合处理耗时较长的任务客户端无需一直等待通过回调优雅地处理最终结果。工业实践参考SOFARPC 框架对这四种调用模式同步、Future、Callback、单向均有完整的实现支持 [3][4]。3.如何选择你可以根据自己的需求参考下面的思路来选择合适的模式你的业务逻辑是简单的请求-响应吗➡️同步模式。它是默认选择简单直接。你的系统需要处理海量并发请求吗➡️异步模式 (Future)。它能有效提升吞吐量。你需要发送日志或监控数据并且不能影响主流程吗➡️单向调用。你需要调用一个耗时很长的任务并且不想阻塞线程吗➡️回调模式。4.补充阅读ISO/IEC 11578:1996 – Information technology. Open systems interconnection. Remote procedure call (RPC).可在 ISO 官网检索购买Rutgers University CS 417 Lecture Notes: Remote Procedure Calls. https://people.cs.rutgers.edu/~pxk/417/notes/rpc-guide.html参考文献[1] Birrell, A.D., Nelson, B.J. Implementing remote procedure calls.ACM Transactions on Computer Systems, 2(1), 39–59 (1984). https://dl.acm.org/doi/10.1145/2080.357392[2] Ananda, A.L., Tay, B.H., Koh, E.K. A survey of asynchronous remote procedure calls.ACM SIGOPS Operating Systems Review, 26(2), 92–109 (1992). https://dl.acm.org/doi/10.1145/382244.382832[3] SOFARPC 官方文档同步异步实现剖析。阿里云开发者社区2018. https://developer.aliyun.com/article/663767[4] SOFARPC 线程模型剖析同步异步与线程模型详解。阿里云开发者社区2018. https://developer.aliyun.com/article/662498