【发布时间】:2017-05-22 10:41:55
【问题描述】:
API 什么时候不 RPC?
在 Twitter 上关于 API 设计的长时间讨论之后。 当 API 不基于 RPC 时,我想尝试得出一个明确的答案。
这个Is That REST API Really RPC? Roy Fielding Seems to Think So似乎有点混乱
该特定链接是关于 REST 和 RPC 的。我的问题只是想问关于 RPC 与不是 RPC 的一般情况,而不是在 HTTP 的上下文中。
TLDR; API IS RPC 何时为 “当它对开发者隐藏网络时”的定义 很公平。
但回到什么时候不是。
Twitter 讨论集中在 HttpClient,因为它不是 RPC。
我的论点是 HttpClient 并没有真正为网络建模。 那里没有任何建模延迟。 网络故障的表现也很弱。 HTTP 中的大多数状态代码与网络无关,例如未找到、需要付款等。
根据语言和 SDK,HttpClient 可能采用字符串或 URI。 如果它需要一个代表 URI 的字符串,这也不能真正传达涉及网络的信息,您需要知道该字符串代表什么以及 URI 是什么。
如果您以前从未见过 HTTP,那么通过查看特定的 API 怎么知道? 有一个 API 使用一个字符串,并返回一个包含字符串或一些 int 响应代码的对象。
你怎么知道?
当然,大多数开发人员都知道 HTTP 是什么,但从严格定义的角度来看,您如何将 API 定义为不是 RPC?
Java“NetworkException”中的已检查异常是否足以清楚地传达涉及网络的信息? 如果您调用的函数具有诸如“SayHelloOverNetwork”之类的描述性名称,是否足以使其不是 RPC?
究竟什么时候一个过程是远程的过程? 所有网络通信都会导致一些代码在接收系统上运行。
如果我们让一个从未接触过技术或协议的人,教这个人一门编程语言。 这个人可以使用“非 RPC”的定义来识别什么是 RPC 而不是什么?
我在这里很密集,可能很傻,但我试图找到“非 RPC”的本质,这究竟需要什么?
它是否需要例如非阻塞才能在未知延迟下正常运行? 或者非 RPC API 会阻塞吗? IMO,如果它是阻塞的,它隐藏了会涉及延迟,因此陷入“延迟为零”的谬论,意味着它隐藏了网络。
这一切似乎对除我之外的其他所有人来说都非常明显,但还没有人给出关于不成为 RPC 的要求的简明答案。
【问题讨论】:
-
看看windows API - 它不是 RPC,尽管它使您可以通过自己的协议(非基于 http)调用远程过程
-
您提到的大多数标准与 RPC 无关。看看 CORBA 和 Sun-RPC。 RPC的本质是,err,Remote Procedure Call。对远程主机的过程调用语义。与延迟网络建模无关,......它应该对你隐藏所有这些。您的问题似乎主要基于您自己对 RPC 是什么的看法,这是错误的。
-
问题是什么不是 RPC,也就是说,如果 RPC 应该对你隐藏网络语义,那么不是 RPC 的 API 应该是相反的,即明确的网络语义。没有?
-
@RogerAlsing 不,它将是非远程的,即本地的,或者具有非过程调用语义。
-
@EJP 这仍然是个问题,“非过程调用语义”看起来如何?调用
httpClient.Get(...)如果您在查看特定 API 时不了解 HTTP,您怎么知道那不是另一端称为“Get”的远程过程?
标签: api network-programming rpc distributed-computing