サブプロセス (それぞれが接続) を持つ Erlang で接続プール プロセスを作成しました。接続プーリング プロセス (スーパーバイザー) は、すべての子サブプロセスの状態を保持する必要があります。たとえば、サブプロセスをリクエスターにリースできるかどうかを示すフラグなどです。この状態は ETS テーブルに保存されます。
プールマスター :
- 接続手順 1
- 接続プロセス 2
- 接続プロセス 3
クライアントが POOL-MASTER への接続を要求するとき、ETS を見て状態を取得することで、どの接続プロセスが利用可能かを見つけなければなりません。このフェーズは「get-lease」と呼ばれます。その後、状態が更新されます。同様に、クライアントが接続をプールに返すとき、次のクライアントが利用できるように項目にフラグを立てる「 return-lease 」関数を使用します。
「 get-leaseとreturn-lease」の上の関数をスレッドセーフにしたい。つまり、クライアントがこれらの関数を同時に使用していないことを確認したいのです。そうしないと、接続の状態が混在する可能性があります (2 つのクライアントが同じ接続を取得します)。Java では、この目的のために同期メソッドが使用されます。
これを達成するためにerlangでできることはありますか? たとえば、ETS テーブルである種のロック メカニズムを使用してから、ロックを解放しますか? または、ロック/ロック解除する特定の機能を処理し、このプロセスにメッセージを送信する単一のプロセスを作成して、これを行う必要があります (メッセージングがシングルスレッドであると仮定します) ?