远程服务调用(上):从本地方法到远程方法的桥梁

发布时间 2023-11-24 10:50:33作者: 盲恋

原始分布式时代的初期确实是奔着这个目标去做的,但这种透明的调用形式反而让程序员们误以为通信是无成本的,从而被滥用,以至于显著降低了分布式系统的性能。

当“透明的RPC调用”一度成为主流范式的时候,安德鲁 · 塔能鲍姆(Andrew Tanenbaum)教授曾发表了一篇论文“A Critique of the Remote Procedure Call Paradigm”,对这种透明的RPC范式提出了一系列质问:

 

  • 两个进程通讯,谁作为服务端,谁作为客户端?
  • 怎样进行异常处理?异常该如何让调用者获知?
  • 服务端出现多线程竞争之后怎么办?
  • 如何提高网络利用的效率,比如连接是否可被多个请求复用以减少开销?是否支持多播?
  • 参数、返回值如何表示?应该有怎样的字节序?
  • 如何保证网络的可靠性,比如调用期间某个链接忽然断开了怎么办?
  • 服务端发送请求后,收不到回复该怎么办?
  • ……

论文的中心观点是:把本地调用与远程调用当作一样的来处理,是犯了方向性的错误,把系统间的调用做成透明的,反而会增加程序员工作的复杂度。

1994年至1997年间,由ACM和Sun的院士Peter Deutsch、套接字接口发明者Bill Joy、Java之父James Gosling等众多在Sun Microsystems工作的大佬们,共同总结了通过网络进行分布式运算的八宗罪(8 Fallacies of Distributed Computing):

 

  1. 网络是可靠的(The network is reliable)
  2. 延迟是不存在的(Latency is zero )
  3. 带宽是无限的(Bandwidth is infinite)
  4. 网络是安全的(The network is secure)
  5. 拓扑结构是一成不变的(Topology doesn't change)
  6. 总会有一个管理员(There is one administrator)
  7. 不考虑传输成本(Transport cost is zero)
  8. 网络是同质化的(The network is homogeneous)

这八宗罪,被认为是程序员在网络编程中经常忽略的八大问题,潜台词就是如果远程服务调用要弄透明化的话,就必须为这些罪过买单。这算是给RPC能否等同于IPC来实现,暂时定下了一个具有公信力的结论。

 

到这时为止,RPC应该是一种高层次的,或者说语言层次的特征,而不是像IPC那样,是低层次的,或者说系统层次的特征,就成为了工业界、学术界的主流观点。

 

到这里,我们就可以得出RPC的定义了:RPC是一种语言级别的通讯协议,它允许运行于一台计算机上的程序以某种管道作为通讯媒介(即某种传输协议的网络),去调用另外一个地址空间(通常为网络上的另外一台计算机)。