我们正在开发一个应用程序,其中分布式系统中不同节点上的多个进程订阅mnesia事件。该表是从其中一个节点上的一个进程写入的。
然而,如果我们能确保按照与桌面上的操作相同的顺序接收事件,则会产生不确定性。
E.g: mnesia:delete(tab1,SomeRec), mnesia:写(tab1,SomeOtherRec)
如果我们有时在写事件之后得到删除事件,我们的设计将无法工作,我们将不得不创建一些其他类型的通知机制。
另外,对不同表(来自同一进程)的操作如何?
mnesia:write(tab1,SomeRec), mnesia:写(tab2,SomeOtherRec)
我们可以确保始终从tab1中的tab1之前获取事件吗?在所有进程和所有节点上?
谢谢, 延
答案 0 :(得分:2)
对于Erlang整体而言,保证从流程A
向流程B
发送消息始终是有序的。
但是,对于两个以上进程之间的邮件,您无法保证从A
发送到B
的邮件会在从C
发送到B
的邮件之前到达,即使A
的消息是全球首先发送的。调度程序,网络延迟或网络问题(特别是如果A
和C
不在同一节点上)可能是很难给出这些保证的原因。
如果您的所有活动都是从同一个流程发送的,那么订购可能是肯定的。否则,您无法信任事件的顺序。
至于mnesia事件,它们都在mnesia_subscr.erl
中进行管理,这是一个单一的gen_server,负责转发节点的所有事件,无论表格如何。因此,这应符合A
至B
原则并保证有序事件。
答案 1 :(得分:0)
我不知道mnesia默认情况下是否会执行您想要的操作,但假设它没有,那么您可能需要开始考虑使用分布式共识算法,例如Paxos?有lib_paxos形式的实现,GPL许可的开源库。
毋庸置疑,这会影响您的表现,但要确保一致性。
答案 2 :(得分:0)
Paxos是您正在寻找的解决方案。选择接受的值是早期接受的提案的最大值。这将创建一个序列,您可以使用它来订购说明。