2

我们正在开发一个应用程序,其中分布式系统中不同节点上的多个进程订阅 mnesia 事件。该表是从其中一个节点上的一个进程写入的。

然而,不确定我们是否可以确保按照与桌面上的操作相同的顺序接收事件。

例如:

mnesia:delete(tab1, SomeRec),
mnesia:write(tab1, SomeOtherRec)

如果我们有时在 write 事件之后得到 delete 事件,我们的设计将无法工作,我们将不得不创建一些其他类型的通知机制。

另外,对不同表(来自同一进程)的操作怎么样?

mnesia:write(tab1, SomeRec),
mnesia:write(tab2, SomeOtherRec)

我们能否确保总是先从 tab1 获取事件,然后再从 tab2 获取事件?在所有进程和所有节点上?

4

3 回答 3

1

对于整个 Erlang 来说,从一个进程A到另一个进程的消息发送B保证总是有序的。

但是,对于两个以上进程之间的消息,您不能保证从 to 发送的A消息将在从toB发送的消息之前到达,即使's 的消息是全局首先发送的。调度程序、网络延迟或网络问题(尤其是如果不在同一个节点上)可能是很难提供此类保证的好例子。CBAAC

如果您的所有事件都是从同一个进程发送的,那么排序是肯定的。否则,您不能相信事件的顺序。

至于 mnesia 事件,它们都在 中进行管理mnesia_subscr.erl,这是一个 gen_server 负责转发节点的所有事件,无论表如何。因此,这应该遵守 toA原则B并保证有序事件。

于 2010-12-01T13:39:00.117 回答
0

Paxos 是您正在寻找的解决方案。使接受值的选择是先前接受的提案的最大值。这将创建一个序列,您可以使用它来订购您的指令。

于 2011-05-02T00:19:55.363 回答
0

我不知道默认情况下 mnesia 是否会做你想做的事,但假设它没有,那么也许你需要开始研究分布式共识算法(如Paxos )的使用?有一个lib_paxos形式的实现,一个 GPL 许可的开源库。

不用说,这会影响你的表现,但会确保一致性。

于 2010-12-03T03:09:42.083 回答