Remote Procedure Calls是一种Client/Server的通信,尝试使得远程调用过程(程序)如同调用本地的过程。
必须转为本机表示的数据。
marshals:直译为“编排”, 在计算机中特 指将数据按某种描述格式编排出来,通常来说一般是从非文本格式到文本格式的数据转化。在rpc Client中指代将参数等转换为不依赖机器的形式(比如在WebService中,我们需要把java对象以xml方式表示并在网络间传输,把java对象转化成xml片段的过程就是marshal)。
发送请求到服务器。
等待回复。
unmarshals: 指marshal的逆过程, 得到结果然后返回给caller。
逆编排参数, 然后建立一个栈框架。
调用procedure。
RPC的stubs能够做到编排和反编排数据, 但是这需要我们使用IDL(interface defination language 接口定义语言)来实现, 转化为同一种对象, 例如我们就可以用JSON来进行编排和反编排。
需要使用到大量的库调用来set thing up: 如何格式化数据, 注册哪些函数以及如何调用它们.
深整合(deep integration):
内存的访问
部分故障
延迟
在分布式的计算:如果机器故光, 则部分应用故障, 我们部分判断是机器故障和网络故障
仅执行一次(Exactly-once):几乎不存在
至少一次:仅用于幂等运算, 客户端保持重试直到得到response, 而服务器如往常一样处理请求.
最多做一次: 即0次, 不知道或者1次. 服务器可能会收到同样的请求两次, 并且必须返回之前一次的回复且不会处理请求, 必须能够识别各个客户端的请求, 所以我们需要一个RPC ID的滑动窗口, 保证客户端RPC id的有序.
零或者1次: 事务语义
RPC作为一种通用的library, 性能是永远是一个很重要的考虑.
主要的资源消耗: 拷贝还有编排/反编排
可以尝试0拷贝技巧
表达: 当我们以本地格式发送数据的时候, 需要在前面说明好我们用到的格式
Scatter-gather writes: 分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。聚集(gather)写入Channel是指在写操作时将多个buffer的数据写入同一个Channel,因此,Channel 将多个Buffer中的数据“聚集(gather)”后发送到Channel。scatter gather经常用于需要将传输的数据分开处理的场合,例如传输一个由消息头和消息体组成的消息,你可能会将消息体和消息头分散到不同的buffer中,这样你可以方便的处理消息头和消息体。
最后根据从cmu课程学到的以上我使用java手写了一个基于http的rpc框架,详情请见https://github.com/yyss1997/yyss1997-RPC
原文:https://www.cnblogs.com/zhilue/p/14057594.html