2017-10-16 13 views
0

キープアライブはTCP上で正常に動作します。しかし、Unix Domain Socketsは私に奇妙な振る舞いを与えてくれます。私はカップルにこのような千件のリクエストを送信する場合:Nodejs Unixドメインソケットでキープアライブ

request.post('http://unix:/tmp/http.sock:/check', { 
    json: { 
    ... 
    }, 
    forever: true, 
    pool: {maxSockets: 10}, 
    headers: { 
    'Host': '', 
    'Connection': 'keep-alive' 
    }) 

カーネルトレースは、2000のソケットが作成され(と閉じられることはありません)されている各要求のための1つを表示します。私は10個のソケットしか作成せず、必要に応じて再利用することを期待しています。

Unixソケットが有効に保たれ、TCPソケットと同じ方法で再利用されるように設定する方法はありますか? requestドキュメントから

+0

キープアライブは、リモート接続がタイムアウトしないようにするために使用されますが、UNIXソケットはコンピュータにとってローカルであり、OSは両端で何が起こっているかを知っています。したがって、ソケットにはキープアライブがありません。 – Rob

答えて

0

この動作は、v8.7.0より前のノードでは無効です。 Unixドメインソケットのキープアライブ固定commit by user benglがv8.7.0ビルドに入れられました。そのビルドは約6日前にリリースされました。

0

あなたがループ内で複数の要求を送信し、複数の新しいプールオブジェクトを作成している場合は意図したとおり、maxSocketsが動作しないことに注意してください。この問題を回避するには、プールオプションでrequest.defaultsを使用するか、プール外にmaxSocketsプロパティを持つプールオブジェクトを作成します。

したがって、ソケットオブジェクトをループ外に作成して、ソケットを期待どおりに再利用する必要があるようです。

+0

この場合のコードは複数の新しいプールオブジェクトを作成していないため、毎回グローバルエージェントをプールとして使用して終了します。また、通常のHTTP over TCPに対してもうまく動作します。 –

+0

@allenluceソケットからキャプチャしたTCP応答を投稿できますか?私は間違ってキープアライブを送信しているのだろうかと思っています。 –

+0

キープアライブヘッダーが送信されている間、ソケットも永続化していました。 'socket()'はすべての接続の代わりに数回しか呼び出されていないことをシステムコールトレースで見ることができました。ちょうど私が投稿した答えをチェックしてください。 –

関連する問題