首页 > 其他分享 >远程服务调用(上):从本地方法到远程方法的桥梁

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

时间:2023-11-24 10:57:28浏览次数:39  
标签:调用 network 网络 RPC 方法 远程 服务端

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

当“透明的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是一种语言级别的通讯协议,它允许运行于一台计算机上的程序以某种管道作为通讯媒介(即某种传输协议的网络),去调用另外一个地址空间(通常为网络上的另外一台计算机)。

标签:调用,network,网络,RPC,方法,远程,服务端
From: https://www.cnblogs.com/manglian/p/17853251.html

相关文章

  • Calendar日历类型常见方法
     Calendar类Calendar类是一个抽象类,它为特定瞬间与YEAR、MONTH、DAY_OF—MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。创建Calendar对象不能使用new关键字,因为Calendar类是一个抽象类,但是它提供了......
  • UEC++头文件添加与函数查找方法
    1.官方函数查找与应用技巧在蓝图中插入函数(中文也可以),右键能看到库名;官网也能查找函数名和使用方法;C++中使用可以将蓝图转化2.UEC++头文件添加VS编译时缺失头文件会报错,ctrl单击调用的函数,进入.h文件中查看的地址,将地址classes后面的目录用#clucde放入如下图如果报错......
  • eclipse查看一个方法被谁引用(调用)的快捷键四种方式
    1.(首推)双击选中该方法,Ctrl+Alt+H如果你想知道一个类的方法到底被那些其他的类调用,那么请选中这个方法名,然后按“Ctrl+Alt+H”,Eclipse就会显示出这个方法被哪些方法调用,最终产生一个调用关系树。2.(次推)选中该方法,Ctrl+Shift+G就显示这个方法被谁引用了,查询在整个工作区中被谁......
  • 详解vue大文件视频切片上传的处理方法
    前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端配合做了一个切片的功能,接下来就详细的给大家介绍一下vue大文件视频切片上传的处理方法,需要的朋友可以参考下 前端上传大文件、视频的时候会出现超时、过大、很慢等情况,为了解决这一问题,跟后端......
  • 物理外键与逻辑外键(on_delete方法)
    外键中on_delete的方法:CASCADE:级联删除,只要删除publish,跟publish关联的book,全都被删除SET_DEFAULT:只要删除publish,跟publish关联的book,的publish字段会变成默认值,一定要配合default使用SET_NULL:只要删除publish,跟publish关联的book,的publish字段会变成空,一定要配合null=T......
  • Dart通过Ffi来实现字符串类型在Isolate里共享的方法
    其实就是将字符串转换为字节数组,然后用\0作为结尾表示字符串的结束;这样就可以定义一个字节数组作为字符串的容器(当然会有要求字符串不能超长,否则会截断,和C语言的字符串使用方式很像了)而且\0在java,js里打印都是会没有任何显示的(但是会占用字节),所以很适合当作字符串结尾来用(因为\0......
  • R数据分析:集成学习方法之随机生存森林的原理和做法,实例解析
    很久很久以前给大家写过决策树,非常简单明了的算法。今天给大家写随机(生存)森林,随机森林是集成了很多个决策数的集成模型。像随机森林这样将很多个基本学习器集合起来形成一个更加强大的学习器的这么一种集成思想还是非常好的。所以今天来写写这类算法。 集成学习方法Ensembl......
  • Python中的构造方法
     构造方法在Python中的使用:创建对象时用于初始化对象的实例变量。通过__init__()来定义1、什么是构造方法在面向对象编程中,构造方法是一个特殊的方法,用于在创建对象时初始化对象的状态。它在对象创建的过程中自动调用,负责为对象设置初始值。构造方法通常用于执行与对象相关的......
  • Android深入学习之ComponentActivity.registerForActivityResult()方法
    ComponentActivity.startActivityForResult()和ComponentActivity.onActivityResult()已经废弃,如下图所示,取而代之的是统一它俩的ActivityResultLauncher。  ActivityResultLauncher对象可以通过ComponentActivity.registerForActivityResult()方法获取。该方法有两个重载。......
  • 方法|如何为开发板调试新的触摸屏
    1.调试新的触摸屏  1.1确定设备信息  输入设备的设备节点名为/dev/input/eventX(也可能是/dev/eventX,X表示0、1、2等数字)。查看设备节点,可以执行以下命令:ls/dev/input/*-l      可以看到类似下面的信息:怎么知道这些设备节点对应什么硬件呢?可以在板子上......