13

I am studying Distributed Systems and when it comes to the RPC part, I have heard about these two semantics (at-most-once and exactly-once). I understand that the at-most-once is used on databases for instances, when we don't want duplicate execution.

First question:

How is this achieved? How does the server know that it shouldnt execute the request again? It might be a duplicate but it might be a legitimate request as well.

The second question is:

What is the difference between the two semantics in the title? I can read :). I know that at-most-once might not be executed at all but, what does exactly-once do that guarantees the execution?

4

5 回答 5

7

对于您的第二个问题,以下是对不同类型的消息语义的一个很好的解释:

最多一次语义:从工程复杂性的角度来看,最容易实现的语义类型,因为它可以通过即发即弃的方式完成。系统的组件很少需要有状态。虽然它是最容易实现的,但最多一次也是最不理想的消息语义类型。它不提供绝对的消息传递保证,因为每条消息都传递一次(最佳情况)或根本不传递。

至少一次语义:这是对最多一次语义的改进。可能有多次尝试传递消息,因此至少有一次尝试成功。换句话说,消息可能会重复,但不会丢失。虽然作为系统范围的特性并不理想,但至少一次语义对于数据重复无关紧要的用例或在消费者端可以进行重复数据删除的场景来说已经足够好了。

Exactly-once 语义:最终的消息传递保证和数据完整性方面的最佳选择。顾名思义,exactly-once 语义意味着每条消息都只传递一次。消息既不能丢失也不能传递两次(或多次)。Exactly-once 是迄今为止最可靠的消息传递保证。这也是最难实现的。

消息传递语义的高级概述

这就是这篇关于Exactly-once 消息处理的博客文章的全部内容(披露:我为Ably工作)

希望这可以帮助

于 2020-11-20T10:44:26.760 回答
4

最多一次语义的情况下,请求在失败的情况下再次发送,但请求在服务器上过滤重复。

恰好一次语义中,请求被再次发送,请求被过滤为重复,并且保证服务器在失败后重新启动并从崩溃的地方开始处理请求。

但是只有一次是无法实现的,因为客户端发送请求时会发生什么,在它到达服务器之前,服务器崩溃了。无法跟踪请求。

http://de.wikipedia.org/wiki/Remote_Procedure_Call#Fehlersemantik

于 2014-07-06T12:41:10.713 回答
1

纠正赫斯珀的回答-

早些时候,恰好有一次 RPC 无法实现,但 2015 年的一篇研究论文 [1] 证明这是可能的。基本上,RIFL 范式保证了被执行的 RPC 的一次执行的安全性被持久存储

[1]:李、科林等人。“实现大规模和低延迟的线性化。” 第 25 届操作系统原理研讨会论文集。ACM, 2015

于 2016-12-13T06:31:25.720 回答
0

Bump,我也在研究这个,发现这个,希望它有帮助(帮助我),

至少一次与最多一次?

让我们举个例子:
如果客户端和服务器保持运行,则获取锁,如果
客户端失败,客户端会收到锁,它可能有或没有锁(服务器需要一个计划!)
如果服务器失败,客户端可能有锁或没有
- 至少 -一次:客户端一直在尝试
最多一次:客户端将收到异常
客户端在异常情况下会做什么?
需要实现一些特定于应用程序的协议
问服务器,我有锁吗?
服务器需要有一个计划来记住重新启动时的状态,
例如,在磁盘上存储锁。
至少一次(如果我们从不放弃)
客户继续尝试。服务器可能多次运行程序

如果请求不是幂等的
但很难使所有请求幂等, 服务器必须使用应用程序状态来处理重复项
,例如,服务器在磁盘上存储良好,每个请求都有锁和 req id
检查表,
即使服务器失败并重新启动,我们也会得到正确的语义
什么是正确的?
取决于使用 RPC 的位置。
简单的应用程序:
最多一次很酷(更像是过程调用)
更复杂的应用程序:
在两种情况下都需要一个应用程序级计划
一次不明确会给你一个帮助
=> 处理机器故障使 RPC 与过程调用不同

引自分布式系统和范例第 2 版

于 2013-06-07T15:38:12.997 回答
0

对于第一个问题,我认为每个请求都应该附加一个唯一的 ID。因此,即使客户端发送了两个具有完全相同命令的请求,服务器也能够通过请求的唯一 ID 进行过滤和区分。

对于第二个问题,我认为本文有助于定义 rpc 调用的语义。http://www.cs.unc.edu/~dewan/242/f97/notes/ipc/node27.html

于 2019-04-05T21:21:09.067 回答