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,但是当服务器之间的同步最终检测到这种重复时协调/恢复/回滚状态......这种方法可能不会用于支付,但它在其他情况下可能很有用,例如论坛帖子) .
| 归档时间: |
|
| 查看次数: |
10306 次 |
| 最近记录: |