2010-12-01 10 views
2

私たちは、分散システムの異なるノード上の複数のプロセスがmnesiaイベントに登録するアプリケーションを開発しています。表は、ノードの1つの単一プロセスから書き込まれます。mnesiaイベントの注文

しかし、テーブル上の操作と同じ順序でイベントを確実に受け取ることができるかどうかは不確実です。

例: mnesia:(TAB1、SomeRec)を削除し、 mnesia:書き込み(TAB1、SomeOtherRec)

私達は時々私たちのデザインは機能しません書き込みイベントの後に削除イベントを取得し、私たちがしなければならない場合他の種類の通知メカニズムを作成します。

また、(同じプロセスの)異なるテーブルの操作についてはどうでしょうか?

mnesia:書き込み(TAB1、SomeRec)、 mnesia:書き込み(TAB2、SomeOtherRec)

我々は常にTAB2から1前TAB1からイベントを取得することを確認できますか?すべてのプロセスとすべてのノードで?

おかげで、全体としてのErlangのために イェンス

+0

どういうわけか、あなたは、より良い何かのために記憶媒体のイベントを使用しようとしているという印象を受けます。しかし、なぜそれに私の指を置くことはできません。あなたはこれらのテーブルイベントで何をしたいのかを精緻に説明できますか? –

+0

それはまったく可能です。とにかくこれを整理することは興味深いでしょう。 – Lii

答えて

2

、プロセスBにプロセスAからのメッセージの送信は、常に順序であることが保証されます。

しかし、以上の2つのプロセス間のメッセージのために、あなたはBAから送信されたメッセージがAのメッセージが世界的に最初に送信された場合でも、BCから送信されたメッセージの前に到着することを保証することはできません。スケジューラ、ネットワーク遅延またはネットワークの問題(特に、ACが同じノードにない場合)が、そのような保証が得にくい理由の良い例になるかもしれません。

すべてのイベントが同じプロセスから送信された場合、発注は確実なことです。それ以外の場合は、イベントの順序を信頼できません。

mnesiaイベントに関しては、それらはすべてmnesia_subscr.erlで管理されます。これは、テーブルに関係なくノードのすべてのイベントを転送する単一のgen_serverです。したがって、これはABの原則に従い、順序付けられたイベントを保証するはずです。

+0

私は、プロセス間のメッセージは常に順番になっていることを理解しています。しかし、記憶媒体は、操作が呼び出しプロセスで発生する順序で常にメッセージを送信しますか?例えば。 mnesia:writeが呼び出されたときにテーブルが書き込み用にロックされている場合、これによりイベントが遅延され、他のイベントが最初に送信される可能性がありますか? – Lii

+1

これは、イベント送信の実装方法によって異なります。それは完了したら、トランザクション内から行われますか?私が知る限り、何回か再試行することができるので、トランザクション内からの副作用で決して物事を行うべきではありません。 –

+1

@IGTA:Liiはmnmesiaテーブルイベントについて話していたので、これらの実装方法についても質問がありました。これらは単一の内部プロセスによって送信されますか(表ごとにノードごとに?) –

0

mnesiaがデフォルトで望むことをするのかどうか分かりませんが、おそらく、Paxosのような分散型コンセンサスアルゴリズムの使用を見る必要があると仮定していますか? lib_paxosというGPLライセンスのオープンソースライブラリの形で実装されています。

言うまでもなく、これはパフォーマンスに影響を与えますが、一貫性を保証します。

+0

残念ながら、それはオプションではありません。記憶装置が動作するか、独自の通知メカニズムを作成する必要があります。 – Lii

+0

yep - 私はPaxosが分散環境でそれを行う堅牢な方法であることを示唆していました。 –

0

あなたが探しているソリューションは、パクソスです。受け入れられた値の選択を、以前に受け入れられた提案の最大値にする。これにより、指示書の注文に使用できるシーケンスが作成されます。