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调用