3

クライアント側でパッシブ ソケットのプールを作成し、他のプロセスに借用することでそれらのプールを管理する gen_server プロセスがあります。他のプロセスは、ソケットを借用し、ソケットを使用してサーバーに要求を送信し、gen_tcp:recv を介して応答を取得し、ソケットを gen_server ソケット プール プロセスに解放できます。

ソケット プール プロセスは、ソケットを借用するすべてのプロセスを監視します。借用したプロセスのいずれかがダウンしている場合、そこからダウン シグナルを受け取ります。

handle_info({'DOWN', Ref, process, _Pid, _Reason}, State) ->

この場合、借用したソケットを空にし、プールに戻して再利用します。問題は、 を使用してソケットをドレインしようとすると、操作が進行中であることを意味するgen_tcp:recv(Socket, 0, 0)inetealreadyエラー メッセージが表示されることです。recv

したがって、問題は、前recvの を中断し、ソケットを正常にドレインし、他のプロセスに再利用する方法です。

ありがとう。

4

1 に答える 1

2

もう 1 レベルの間接化により、状況が大幅に単純化されます。

ソケットを使用する必要があるプロセスにソケットを渡す代わりに、各ソケットを、それを所有し、システム内のソケットを表す別のプロセスによって制御します。ソケットの「借用」を実装するために、必要に応じてソケットとの間で Erlang 側のメッセージをルーティングします (さらに柔軟に、特定のプロトコルを話すコールバック モジュールをソケット コントローラーに渡します。 Erlang メッセージは内部的に)。

これを行うと、ソケットの制御が失われたり、ソケットが不確定な状態になったりすることはありません。代わりに、ソケットは常に単一の所有プロセスによって保持されます。route-manager/pool-manager プロセスに'DOWN'メッセージを受信させる代わりに、ソケット コントローラに現在使用中のプロセスを監視させます。を受信する'DOWN'と、必要に応じて状態を変更できます。

所有者として指定されていないソケット間で、開いているファイル記述子、ソケット、およびその他のタイプのポートを渡すという奇妙な状況に陥ることがあります。複数のノードにわたってプログラムをスケーリングする必要がある場合、ポートとソケットを渡すことも問題になります (突然、物がどこに渡され、どのノードにあるのかなどに注意する必要があります)。

于 2015-12-03T23:31:05.433 に答える