RPC语义究竟是什么目的

Pra*_*gre 17 networking rpc semantics

我正在经历rpc语义,至少一次和最多一次的语义,它们是如何工作的?

无法理解其实施的概念.

Mic*_*yan 49

在这两种情况下,目标都是调用一次函数.但是,不同之处在于它们的故障模式.在"至少一次"中,系统将在失败时重试,直到它知道该函数被成功调用,而"最多一次"将不会尝试重试(或将确保对该函数的否定确认)重试前调用).

至于如何实现这些,这可能会有所不同,但伪代码可能如下所示:

At least once:
    request_received = false
    while not request_received:
       send RPC
       wait for acknowledgement with timeout
       if acknowledgment received and acknowledgement.is_successful:
          request_received = true


At most once:
   request_sent = false
   while not request_sent:
      send RPC
      request_sent = true
      wait for acknowledgement with timeout
      if acknowledgment received and not acknowledgement.is_successful:
         request_sent = false
Run Code Online (Sandbox Code Playgroud)

你最想做"最多一次"的一个例子就是付款(你不会不小心对某人的信用卡两次开票),其中"至少一次"的例子就是比如使用特定值更新数据库(如果您碰巧连续两次将相同的值写入数据库,那么对任何事情都没有任何影响).你几乎总是想对非变异(也就是幂等)操作使用"至少一次"; 相反,大多数变异操作(或者至少是那些逐渐改变状态并因此在应用突变时依赖于当前/先前状态的操作)将需要"最多一次".

我应该补充一点,通过在RPC的主体中包含唯一标识它的标识符并在服务器上确保看到的每个ID,在"至少一次"系统之上实现"最多一次"语义是相当普遍的.由系统只处理一次.您可以考虑TCP数据包中的序列号(确保数据包一次性按顺序传送)作为此模式的特殊情况.然而,这种方法在分布式系统上正确实现可能有些挑战,在分布式系统上,同一RPC的重试可能会到达运行相同服务器软件的两台独立计算机.(处理此问题的一种方法是记录收到RPC的事务,但是在将系统内的请求重新分发以进行进一步处理之前,使用集中式系统对这些记录进行聚合和重复数据删除; 另一种技术是机会性地处理RPC,但是当服务器之间的同步最终检测到这种重复时协调/恢复/回滚状态......这种方法可能不会用于支付,但它在其他情况下可能很有用,例如论坛帖子) .

  • 所以,如果我考虑登录服务,那么在它的情况下,至少一次语义将是调用的最佳选择. (2认同)