Networking RPC语义的目的到底是什么

Networking RPC语义的目的到底是什么,networking,rpc,semantics,Networking,Rpc,Semantics,我正在研究rpc语义,至少一次,最多一次语义,它们是如何工作的 无法理解其实现的概念。在这两种情况下,目标都是调用函数一次。然而,不同之处在于它们的故障模式。在“至少一次”中,系统将在失败时重试,直到知道函数已成功调用为止,而“最多一次”将不会尝试重试(或将确保在重试之前有对调用的否定确认) 至于如何实现这些,可能会有所不同,但伪代码可能如下所示: At least once: request_received = false while not request_received

我正在研究rpc语义,至少一次,最多一次语义,它们是如何工作的


无法理解其实现的概念。

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

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

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
例如,您希望“最多一次”的情况类似于付款(您不希望意外地向某人的信用卡开两次账单),其中“至少一次”的情况类似于使用特定值更新数据库(如果您碰巧在一行中向数据库写入相同的值两次,这实际上不会对任何事情产生任何影响)。您几乎总是希望对非变异(也称为幂等)操作使用“至少一次”;相比之下,大多数变异操作都使用“至少一次”(或者至少是那些增量突变状态并因此在应用突变时依赖于当前/先前状态的)将需要“最多一次”


我应该补充一点,在“至少一次”系统之上实现“最多一次”语义是相当常见的,方法是在RPC主体中包含唯一标识它的标识符,并在服务器上确保系统看到的每个ID只处理一次。您可以想到TCP包中的序列号(确保数据包一次按顺序传递)作为此模式的特例。但是,在分布式系统上正确实施此方法可能会有一定的挑战性,因为在分布式系统中,相同RPC的重试可能会到达运行相同服务器软件的两台独立计算机。(处理此问题的一种技术是记录接收到RPC的事务,然后在系统内重新分发请求以供进一步处理之前,使用集中化系统聚合并消除这些记录的重复;另一种技术是机会主义地处理RPC,但协调/恢复/回滚状态为:当服务器之间的同步最终检测到这种重复时……这种方法可能不会用于支付,但在其他情况下(如论坛帖子)可能会很有用)例如,如果我考虑登录服务,那么在它的情况下,至少一次语义将是最好的调用。@ PavaNigaRe:是的,至少一次是所有幂等操作的最佳模型。谢谢,但这是最多一次的伪代码吗?代码使看起来好像请求将自动怨恨如果阿克诺。wledgement不成功,但我不确定这是否正确。这种行为不是选择性加入吗?我假设如果客户想要这种行为,他们必须自己配置。