2

Erlang/OTP でアプリケーションを作成しており、バージョン記録システムでシーケンシャル カウンターを使用したいと考えています。

私は最初にそれらを実装しました

mnesia:dirty_update_counter
しかし、それを使用した経験により、次の厳しい要件が解消されました。

カウンターには次のプロパティが必要です。

  • 厳密にシーケンシャルであること - 1 の後に 2 が続き、3 が続くなど、シーケンスはシステムの分散セットで共有されます。いくつかの通信があり、再同期する必要があります

  • 分散データベースで安全

mnesia:dirty_update_counter
これらの要件のいずれも満たしていません。

シーケンシャル データベース カウンターを実装するにはどうすればよいですか?

4

4 に答える 4

1

メッセージブローカーについてはありますか?RabbitMQをロードし、永続キューと永続メッセージを設定することで、Erlangに保持できます。メッセージ本文の番号を1つ増やすコンシューマーを作成し、元の番号を確認するときに、その新しい番号を新しいメッセージのキューに公開します。

うまくいくかどうかはわかりませんが、本文に1が含まれる最初のメッセージを手動で公開すると、オフになって実行されているように見えます。

于 2009-03-27T03:47:55.287 に答える
1

数値を提供する erlang プロセスを提案するつもりでした。erlang はメッセージを順番に処理するので、メッセージを順番に受け取ることが保証されます。それらを永続化することは、何らかの形で必要になります。上記のRabbitMQの提案は1つの方法ですが、やり過ぎだと感じる場合は、プロセスを定期的にファイルに保存するだけで十分です。目的には gen_server で十分です。

于 2009-04-01T03:57:39.607 に答える
1

Mnesia データはアトミックに複製されることが保証されていないため、何らかの方法で手動でロックする必要があります。3 つの選択肢があります (2 つはロックあり、もう 1 つはロックなし):

  • 新しいバージョン番号を要求するときに、テーブルで読み取りロックを使用します。ただし、それはトランザクションを意味します。

  • バージョン番号を追跡し、アトミックにインクリメントする中央サーバーを使用します。たとえば、ノードの 1 つでバージョン番号を要求するプロセスを実行します。

  • サーバーを NTP と同期し、タイムスタンプを使用します。

于 2009-03-25T18:41:15.590 に答える
1

おそらく最も簡単な答えは、(レプリケートされた同期のために) 書き込みロックを取得し、カウンターの現在の値を取得し、それをインクリメントして DB に保存するトランザクション関数を作成することによって、あなたが探しているものです。確かに、システムがスケーリングするにつれてオーバーヘッドが増加しますが、これを行うサーバーを作成し、ノードのサブセットで実行することをお勧めします。ロックの競合がクラスターのサイズに直接関係しないようにするためです。

于 2009-04-12T22:38:31.003 に答える