8

私はErlangで作られたサーバーアプリケーションを持っています。その中に私は写真に関するいくつかの情報を保存するmnesiaテーブルを持っています。「すべてがプロセスである」という精神で、私はそのテーブルをgen_serverモジュールでラップすることにしました。そのため、 gen_serverモジュールはテーブルに直接アクセスする唯一のモジュールです。そのテーブルへの情報のクエリと追加は、そのプロセス(登録された名前を持つ)にメッセージを送信することによって行われます。アイデアは、そのテーブルから情報をクエリするいくつかのクライアントプロセスがあるということです。

これは問題なく機能しますが、そのgen_serverモジュールには状態がありません。必要なものはすべてmnesiaテーブルに保存されます。それで、私gen_serverはおそらくそのテーブルをカプセル化するための最良のモデルではないのだろうか?

単にプロセスにするのではなく、そのモジュールの関数を介してテーブルをカプセル化するだけでよいのでしょうか。gen_serverそのモジュールにバグがあると、呼び出しプロセスがクラッシュします。これは、プロセスがクラッシュして全員が残る現在とは対照的に、単一のクライアントにのみ影響するため、より良いと思います。 テーブルにアクセスせずに(スーパーバイザがテーブルを再起動するまで)。

どんな入力でも大歓迎です。

4

3 に答える 3

10

オッカムの剃刀によると、特に状態がまったく保存されていないため、これが存在する必要gen_serverはないと思います。このようなプロセスは、テーブル(またはその他のリソース)へのアクセスを厳密にシーケンシャルにする必要がある場合に必要になる可能性があります(たとえば、ボトルネックを犠牲にしてトランザクションの中止を回避したい場合があります)。

テーブルへのアクセスをモジュールにカプセル化することは、優れたソリューションです。適切なレベルの抽象化とカプセル化を提供しながら、追加の複雑さを作成しません。

于 2009-09-17T09:16:37.290 に答える
6

なぜあなたがプロセスでテーブルをカプセル化することに決めたのか理解できません。Mnesiaは、ローカルとクラスター全体に分散されたテーブルへの複数の同時アクセスを仲介するように設計されています。

すべての特定のテーブルアクセス操作と更新を実行するAPIモジュールを作成することは、API関数がそれらを呼び出すコードで意図をよりよく伝えるため、良い考えです。mnesia操作を呼び出し元のコードに直接入れるよりも読みやすくなります。

APIモジュールには、必要に応じて、後でmnesiaから他のストレージシステムに切り替えるオプションもあります。APIモジュール内でmnesiaトランザクションを使用すると、mnesiaがクラッシュする操作をロールバックするため、プログラミングエラーから保護されます。APIモジュールは常に呼び出し元が利用でき、任意の数の呼び出し元が同時に操作を実行できるようにしますが、gen_serverベースのAPIには、APIを使用できなくする可能性のある単一障害点プロセスがあります。

gen_serverベースのAPIが純粋に機能するAPIに対して提供する唯一のことは、テーブルへのアクセスをシリアル化することです。これは珍しい要件であり、特に必要でない限り、パフォーマンスを低下させます。

于 2009-09-17T15:59:34.697 に答える
0

ダーティアクセスを使用してトランザクションを回避する場合は、単一のgen_serverプロセスを使用してmnesiaテーブルを処理することをお勧めします。このアプローチはtxsよりも高速である可能性がありますが、通常どおり、ベンチマークを行う必要があります。

于 2014-05-21T12:02:27.310 に答える