2010-12-01 17 views
2

Wir entwickeln eine Anwendung, bei der mehrere Prozesse auf verschiedenen Knoten in einem verteilten System mnesia-Ereignisse abonnieren. Die Tabelle wird von einem einzigen Prozess auf einem der Knoten geschrieben.Bestellung von mnesia-Ereignissen

Es ist jedoch Unsicherheit entstanden, ob wir sicher sein können, dass die Ereignisse in der gleichen Reihenfolge wie die Operationen auf dem Tisch empfangen werden.

ZB: Mnesia: löschen (tab1, SomeRec), Mnesia: write (tab1, SomeOtherRec)

Wenn wir manchmal das Lösch Ereignis nach dem Schreibvorgang unseres Design arbeiten würde nicht erhalten, und wir müssten Erstellen Sie eine andere Art von Benachrichtigungsmechanismus.

Auch, wie wäre es mit Operationen an verschiedenen Tabellen (aus dem gleichen Prozess)?

Mnesia: schreiben (tab1, SomeRec), Mnesia: write (tab2, SomeOtherRec)

Können wir immer das Ereignis aus tab1 vor dem aus tab2 sicher sein, zu bekommen? Auf allen Prozessen und allen Knoten?

Danke, Jens

+0

Irgendwie habe ich den Eindruck, dass Sie versuchen, die Mnesia-Ereignisse für etwas besser gemacht anders zu verwenden. Darf ich nicht sagen warum. Können Sie näher erläutern, was Sie mit diesen Tischveranstaltungen genau machen wollen? –

+0

Das ist absolut möglich. Aber es wäre interessant, dies trotzdem zu klären. – Lii

Antwort

2

Für Erlang als Ganze wird das Senden von Nachrichten von einem Prozess A ein Verfahren B garantiert stets in Ordnung zu sein.

jedoch für Nachrichten zwischen mehr als zwei Prozesse, können Sie nicht garantieren, dass Nachrichten A-B gesendet C-B vor Nachrichten eintreffen wird gesendet, auch wenn A ‚Botschaften weltweit erste gesendet wurden. Die Scheduler-, Netzwerklatenz- oder Netzwerkprobleme (insbesondere wenn A und C nicht auf demselben Knoten sind) könnten gute Beispiele dafür sein, warum solche Garantien schwer zu geben sind.

Wenn alle Ihre Ereignisse aus demselben Prozess gesendet werden, kann die Bestellung eine sichere Sache sein. Andernfalls können Sie der Reihenfolge der Ereignisse nicht vertrauen.

Wie für MNS-Ereignisse, sie sind alle in mnesia_subscr.erl verwaltet, die eine einzige gen_server übernimmt die Weiterleitung aller Ereignisse für einen Knoten, unabhängig von der Tabelle. Dieser sollte somit das A bis B Prinzip einhalten und geordnete Ereignisse garantieren.

+0

Ich verstehe, dass die Nachrichten zwischen Prozessen immer in Ordnung sind.Aber sendet mnesia die Nachrichten immer in der Reihenfolge, in der die Operationen im aufrufenden Prozess stattfinden? Z.B. Wenn eine Tabelle zum Schreiben gesperrt ist, wenn mnesia: write aufgerufen wird, kann dies dazu führen, dass das Ereignis verzögert wird und ein anderes Ereignis zuerst gesendet wird? – Lii

+1

Das hängt davon ab, wie Sie das Senden von Ereignissen implementieren. Wird es innerhalb der Transaktion, sobald es abgeschlossen ist, etc. getan? Soweit ich weiß, sollten Sie nie Dinge mit Nebenwirkungen innerhalb einer Transaktion tun, weil es einige Male wiederholt werden könnte. –

+1

@IGTA: Lii sprach über Mnmesia-Tabellenereignisse, also ist es auch eine Frage, wie diese implementiert werden. Werden diese durch einen einzigen internen Prozess gesendet (pro Knoten ?, pro Tabelle?) –

0

Ich weiß nicht, ob Mnesia wird tun, was Sie wollen, standardmäßig, aber vorausgesetzt, dass es nicht dann vielleicht müssen Sie beginnen, die Verwendung von verteilten Konsens-Algorithmen wie Paxos zu betrachten? Es gibt eine Implementierung in Form von lib_paxos, einer GPL-lizenzierten Open-Source-Bibliothek.

Unnötig zu sagen, dass dies Auswirkungen auf Ihre Leistung hat, aber Konsistenz gewährleistet.

+0

Leider ist das keine Option. Entweder verhält sich Mnesia oder wir müssen unseren eigenen Benachrichtigungsmechanismus erstellen. – Lii

+0

yep - Ich war (irgendwie) darauf hin, dass Paxos eine robuste Möglichkeit ist, das in einer verteilten Umgebung zu tun ... –

0

Paxos ist die Lösung, nach der Sie suchen. Die Auswahl der akzeptierten Werte ist ein Max von früher akzeptierten Vorschlägen. Dadurch wird eine Sequenz erstellt, mit der Sie Ihre Anweisungen bestellen können.