13

erlangサーバーを構築しています。ユーザーはhttpリクエストをサーバーに送信して、ステータスを更新します。サーバー上のhttp要求プロセスは、ユーザーステータスメッセージをメモリに保存します。サーバーは毎分、すべてのメッセージをリモートサーバーに送信し、メモリをクリアします。ユーザーが1分間に数回ステータスを更新すると、最後のメッセージが前のメッセージを上書きします。すべてのメッセージを読み取ってからクリアするまでの間、他のプロセスがステータスメッセージを書き込めないことが重要です。

それを実装するための最良の方法は何ですか?

  1. dictを持つgen_server。キーはユーザーIDになります。dict:store / 3は、ステータスを更新または作成します。gen_serverは、「トランザクション」の問題を解決します。

  2. ram_copiesを含むmnesiaテーブル。トランザクションを処理し、gen_serverを実装する必要はありません。このソリューションにはオーバーヘッドが多すぎますか?

  3. より軽量でgen_serverを持つETSテーブル。ETSで取引を行うことは可能ですか?すべてのメッセージを読んでからクリアするまでの間にテーブルをロックするには?

ありがとう

4

1 に答える 1

19

手動で同期を行うため、記憶喪失が多すぎます。ネットワーク関連のものは明らかに必要ありません。これが ets と mnesia の主な違いです。

私が理解している限り、Ets は dict/bag/... に関する otp 準拠のプロセスであり、データにアクセスする複数のプロセスがあるため、ets を使用する必要があります。

私は自分のために次のロジックを思いつきました:

Multiple processes on multiple VMs -> mnesia
Multiple processes on one VM -> ets/dets
One process -> bag/dict/...
于 2010-01-29T17:24:53.407 に答える