2

分散システム内の異なるノード上の複数のプロセスが mnesia イベントにサブスクライブするアプリケーションを開発しています。テーブルは、ノードの 1 つで 1 つのプロセスから書き込まれます。

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

例えば:

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

書き込みイベントの後に削除イベントが発生することがある場合、設計が機能せず、別の種類の通知メカニズムを作成する必要があります。

また、(同じプロセスからの)異なるテーブルでの操作はどうですか?

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

tab2 からのイベントの前に、常に tab1 からのイベントを確実に取得できますか? すべてのプロセスとすべてのノードで?

4

3 に答える 3

1

Erlang 全体として、プロセスからプロセスAへのメッセージの送信はB、常に順番どおりに行われることが保証されています。

ただし、3 つ以上のプロセス間のメッセージの場合、 から送信されたメッセージが から に送信されたメッセージよりABに到着することは保証できません。 のメッセージが最初にグローバルに送信されCBとしてもです。Aスケジューラ、ネットワーク レイテンシ、またはネットワークの問題 (特にACが同じノード上にない場合) は、そのような保証を提供するのが難しい理由の良い例かもしれません。

すべてのイベントが同じプロセスから送信される場合、順序付けは確実です。そうしないと、イベントの順序を信頼できません。

mnesia イベントmnesia_subscr.erlに関しては、テーブルに関係なく、ノードのすべてのイベントの転送を担当する単一の gen_server である ですべて管理されます。したがって、これは原則に準拠し、A順序B付きイベントを保証する必要があります。

于 2010-12-01T13:39:00.117 に答える
0

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

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

于 2010-12-03T03:09:42.083 に答える
0

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

于 2011-05-02T00:19:55.363 に答える