2

サブプロセス (それぞれが接続) を持つ Erlang で接続プール プロセスを作成しました。接続プーリング プロセス (スーパーバイザー) は、すべての子サブプロセスの状態を保持する必要があります。たとえば、サブプロセスをリクエスターにリースできるかどうかを示すフラグなどです。この状態は ETS テーブルに保存されます

プールマスター :

  • 接続手順 1
  • 接続プロセス 2
  • 接続プロセス 3

クライアントが POOL-MASTER への接続を要求するとき、ETS を見て状態を取得することで、どの接続プロセスが利用可能かを見つけなければなりません。このフェーズは「get-lease」と呼ばれます。その後、状態が更新されます。同様に、クライアントが接続をプールに返すとき、次のクライアントが利用できるように項目にフラグを立てる「 return-lease 」関数を使用します。

「 get-leasereturn-lease」の上の関数をスレッドセーフにしたい。つまり、クライアントがこれらの関数を同時に使用していないことを確認したいのです。そうしないと、接続の状態が混在する可能性があります (2 つのクライアントが同じ接続を取得します)。Java では、この目的のために同期メソッドが使用されます。

これを達成するためにerlangでできることはありますか? たとえば、ETS テーブルである種のロック メカニズムを使用してから、ロックを解放しますか? または、ロック/ロック解除する特定の機能を処理し、このプロセスにメッセージを送信する単一のプロセスを作成して、これを行う必要があります (メッセージングがシングルスレッドであると仮定します) ?

4

2 に答える 2

3

アプローチの 1 つは、メッセージングを介してリースを管理するための専用のプロセスを用意することです。そのプロセスに get_lease メッセージを送信します。リース メッセージを受信して​​アクセスをシリアル化し、リースが利用可能になったときに要求プロセスに応答メッセージを送信します。賃借人は管理者に return_lease メッセージを送信し、管理者はリースをフリー リストに追加します。

マネージャーは、リースを取得して返却に失敗するプロセスについても何かをしなければなりません。これはリースなので、これに使用できる有効期限があると思われますが、おそらく管理者は賃借人を監視し、賃借人が失敗した場合はリースを解放する必要があります。

于 2013-10-26T13:15:13.820 に答える
3

スレッドセーフ?それは何ですか ?Erlang はそれを知りません :)私たちはプロセス間でのメッセージの受け渡しに取り組んでいるためです。これにより、(サーバーの erlang プロセスによって維持される) あらゆる構造へのアクセスが常にシリアル化された方法で行われることが保証されます[ Don Bransonが述べたことと同じです]。

私がしたことは次のとおりです。

1. スーパーバイザー プロセスによって監視される gen サーバー プロセスを作成します。

2. このサーバー プロセスは ETS テーブルのマネージャーとなり、接続を要求および解放するためにクライアントによって呼び出される API/メソッドを公開します。

3. 要求は、handle_call (同期呼び出しの場合) または handle_cast (非同期呼び出しの場合) によって処理されます。

4. タイムアウト機能を実装して、ETS テーブルを繰り返し処理し、いくつかの基準に基づいて削除することで、接続を解放することもできます。

上記はうまく機能し、まともなパフォーマンスも得られます(パフォーマンスが気になる場合)。アクセスがシリアル化されるため、競合状態はありません。

于 2013-10-26T14:32:05.987 に答える