Erlang Tracing:因果一致性?

Posted

技术标签:

【中文标题】Erlang Tracing:因果一致性?【英文标题】:Erlang Tracing: Causal consistency? 【发布时间】:2014-05-19 10:21:57 【问题描述】:

Erlang 保证两个进程之间的因果一致性,即从进程 A 发送到进程 B 的消息保证按照它们发送的顺序到达,但对于从其他进程到达的消息,不保证此顺序。

我的问题是:当使用Erlang:trace 函数来跟踪多个进程时,这是否在接收到的跟踪消息的顺序上提供了更高级别的内存一致性,还是我们仍然有因果关系一致性?

把它放在一个更清晰的场景中:

如果进程 A 正在跟踪进程 B 和 C 发送的消息,我们可以保证从 B 接收的跟踪消息是按顺序接收的(因果一致性),但是相对于来自 C 的跟踪消息,它们的顺序是否有任何保证?

谢谢

【问题讨论】:

【参考方案1】:

虽然启用跟踪是 VM 级别的操作,但跟踪消息本身是标准 Erlang 消息,从被跟踪进程发送到正在执行跟踪的进程(通过调用 erlang:trace/3 启用跟踪)。因此,您可能遇到的所有不一致都是由消息传递本身的异步性质引起的。

如果 A 和 C 正在跟踪 B 发送的消息,他们将以相同的顺序查看它们。

另一种情况可以通过一些不同的示例更容易解释: A 正在跟踪 B 和 C 发送的消息,而 B 和 C 正在向 D 发送消息。理论上,A 这些消息的顺序可能与 D 不同,但这必须是一个非常极端的边缘情况。

但这对于理解你的系统来说应该不是问题,如果你想知道 D 接收到的消息的顺序,你可以跟踪 D 接收到的消息。为了确定,你还应该跟踪调用的函数receive 子句(如果有的话),因为接收消息可能与处理接收消息不同。

一般来说,就像在函数调用中包装消息发送是个好主意一样,跟踪函数也是个好主意,因为它们是正在执行的东西。唯一的例外是调试receive 子句,其中一些防护或模式匹配可能导致进程忽略其中一条消息。在每个receive 子句中都有一个函数调用(最好没有其他)是一个很好的做法,因为这是您可以实际跟踪的内容。

【讨论】:

使用第四个进程 D 使示例更清晰!所以我们只能假设 Erlang 跟踪中的因果一致性,即使这可能只在极少数情况下被违反。谢谢!【参考方案2】:

当进程A 以与B 发送消息相同的顺序发送消息时,将看到来自B 的跟踪消息。

当进程A 以与C 接收消息相同的顺序接收消息时,将看到来自C 的跟踪消息。

看到这些跟踪消息是从两个不同的进程发送的,因此无法保证A 将看到这些消息的相对顺序。 A 将按照消息到达A 的顺序查看消息。这与从多个进程接收消息时的行为相同,您会按照它们到达进程的顺序查看消息,这可能与它们发送的顺序不同。请注意,只有在发送时间非常接近时才会影响结果。

如果这回答了你的问题。

【讨论】:

以上是关于Erlang Tracing:因果一致性?的主要内容,如果未能解决你的问题,请参考以下文章

分布式系统中的一致性,与数据库的隔离级别

hash-ring[C]一个七年前开始开发的基于SHA-1 和 MD5的一致性hash库实现,提供了Java与Erlang调用

图解一致性模型

复制延迟案例-一致前缀读

分布式系统中的一致性模型

分布式系统中的一致性模型