質問

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

これは正常に機能しますが、その gen_server モジュールには状態がありません。すべてそれ requireはmnesiaテーブルに保存されます。だから、 gen_server はおそらく そのテーブルをカプセル化するのに最適なモデルではありませんか?

単にプロセスにせず、代わりにテーブルのみをカプセル化する必要があります そのモジュールの機能を通じて?そのモジュールのバグの場合、それは 呼び出しプロセスがクラッシュする原因になります。 現在ではなく、単一のクライアントにのみ影響します。 gen_server プロセスがクラッシュし、全員がテーブルにアクセスできなくなる(まで スーパーバイザーが再起動します)。

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

役に立ちましたか?

解決

Occam's razor にはこの gen_server が存在する必要はありません。特に、状態は絶対に保存されていないためです。このようなプロセスは、テーブル(またはその他のリソース)へのアクセスが厳密にシーケンシャルである必要がある場合に必要になる可能性があります(たとえば、ボトルネックのコスト)。

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

他のヒント

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top