gpt4 book ai didi

networking - RPC语义的确切目的是什么

转载 作者:行者123 更新时间:2023-12-03 13:41:40 24 4
gpt4 key购买 nike

我正在经历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,但是要在服务器之间的同步最终检测到此重复时协调/还原/回滚状态……这种方法可能无法实现付款,但在论坛帖子等其他情况下很有用)。

关于networking - RPC语义的确切目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13330067/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com