订购mnesia活动

时间:2010-12-01 10:07:19

标签: events erlang mnesia subscribe

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

然而,如果我们能确保按照与桌面上的操作相同的顺序接收事件,则会产生不确定性。

E.g: mnesia:delete(tab1,SomeRec), mnesia:写(tab1,SomeOtherRec)

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

另外,对不同表(来自同一进程)的操作如何?

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

我们可以确保始终从tab1中的tab1之前获取事件吗?在所有进程和所有节点上?

谢谢, 延

3 个答案:

答案 0 :(得分:2)

对于Erlang整体而言,保证从流程A向流程B发送消息始终是有序的。

但是,对于两个以上进程之间的邮件,您无法保证从A发送到B的邮件会在从C发送到B的邮件之前到达,即使A的消息是全球首先发送的。调度程序,网络延迟或网络问题(特别是如果AC不在同一节点上)可能是很难给出这些保证的原因。

如果您的所有活动都是从同一个流程发送的,那么订购可能是肯定的。否则,您无法信任事件的顺序。

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

答案 1 :(得分:0)

我不知道mnesia默认情况下是否会执行您想要的操作,但假设它没有,那么您可能需要开始考虑使用分布式共识算法,例如Paxos?有lib_paxos形式的实现,GPL许可的开源库。

毋庸置疑,这会影响您的表现,但要确保一致性。

答案 2 :(得分:0)

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