远程调用由于涉及到服务器和客户端等多个节点以及需要通过网络通讯等,会引入更多的故障可能。本地调用的语义都是恰好一次 ,不会多也不会少。而远程调用的语义就比较复杂,依据三个选择将产生不同的语义:
1)重发请求消息:客户端是否重发请求,直到收到应答或者认定服务器故障为止
2)过滤重复消息:当客户端重发请求时候,服务器是否过滤重复的请求
3)重传结果:服务器是否保存结果消息的历史,以便服务器不用重新执行操作就能重传结果。
对这三个选择的不同组合将产生三种可能的远程调用语义:
重发请求消息 过滤重复消息 重传结果 语义
否 不适用 不适用 或许
是 否 重新执行操作 至少一次
是 是 重传结果 至多一次
或许调用语义 :远程方法可能执行一次,或者根本不执行(在消息遗漏或者服务器崩溃的情况下)
至少一次调用语义 :远程方法要嘛至少执行一次并返回结果,要嘛返回一个异常。因为启用了重发请求消息,服务器也重新执 行操作,因此远程调用至少执行一次,除非服务器崩溃;但是,由于服务器重新执行操作,如果调用不是幂等的,那么多次重复执行将产生副作用叠加,可能不符合 预期需求。对于幂等操作,至少一次调用语义是可以接受的。
至多一次调用语义 :在此语义下,服务器会过滤重复的请求,并且缓存执行的结果重传而非重新执行。因此远程调用同样也是 返回调用结果,或者一个异常。在返回结果的情况下,可以确认服务器恰好执行一次,与本地调用语义一样,不会有副作用叠加。如果返回异常,就是通知调用者没 有返回结果,远程调用要嘛执行了一次,要嘛根本没有执行。总之,远程调用至多执行一次。
Java RMI的调用语义是至多一次。
远程调用的语义
最新推荐文章于 2022-10-19 08:12:48 发布