2009-09-17 14 views
8

私はErlangで作られたサーバーアプリケーションを持っています。その中には、写真に関する情報を保存している記憶媒体テーブル があります。 「すべてが プロセスです」の精神で、gen_serverモジュールでそのテーブルをラップすることにしました。つまり、テーブルに直接アクセスするのは gen_serverモジュールだけです。 を照会し、そのテーブルに情報を追加するには、そのプロセス (登録された名前を持つ)にメッセージを送信します。その考えは、複数のクライアントがそのテーブルの情報を照会する処理を行うことです。gen_serverを使用してmnesiaテーブルをカプセル化しますか?

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

私は単にそれをプロセスにしてはならず、代わりにそのモジュールの関数を通してテーブル をカプセル化するだけですか?このモジュールのバグの場合、 は、呼び出し元のプロセスがクラッシュする原因となります。これは、 という単一のクライアントにのみ影響するためです。これは、今度は、 gen_serverプロセスにクラッシュし、誰もがテーブルにアクセスできない状態になります( までスーパーバイザが再起動します)。

ご迷惑をおかけしますが、何卒ご了承ください。

答えて

9

私はOccam's razorによると、このgen_serverがそれに保存されているいかなる状態は絶対にありません、特に以来、を存在させるための必要がないと思います。テーブル(または他のリソース)へのアクセスが(厳密にシーケンシャル)になる必要がある場合(たとえば、の場合は、ボトルネックを払って中止されたトランザクションは避けたい)

モジュールのテーブルへのカプセル化アクセスは、良い解決策ですです。追加の複雑さがないを作成し、の適切なレベルの抽象化とカプセル化を提供しながら、を作成します。

6

私はなぜプロセスでテーブルをカプセル化することにしたのか分かりません。 Mnesiaは、複数のテーブルへの複数の同時アクセスを仲介するように設計されています。

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

APIモジュールでは、必要に応じてmnesiaから他のストレージシステムに切り替えることもできます。あなたのAPIモジュールの内部でmnesiaトランザクションを使用すると、mnesiaがクラッシュするロールバック操作が行われるため、プログラミングエラーから保護されます。 APIモジュールは常に発信者が利用できるようになり、任意の数の発信者が同時に操作を実行できるようになります。一方、gen_serverベースのAPIは、APIを使用できないようにする障害点(プロセス)を持ちます。

gen_serverベースのAPIが純粋に機能的なAPIを上回る唯一のことは、テーブルへのアクセスをシリアル化することです。これは珍しい要件であり、特に必要としない限り、パフォーマンスのキラーになります。

0

不正アクセスを使用してトランザクションを回避する場合は、単一のgen_serverプロセスを使用してmnesiaテーブルを処理することをお勧めします。この手法はtxsより高速かもしれませんが、通常はベンチマークする必要があります。

関連する問題