2017-10-16 175 views
0

Keep-alive在TCP上工作得很好。但是Unix域套接字給了我奇怪的行爲。如果我送幾千的要求是這樣的:Nodejs與Unix域套接字保持連接

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

內核跟蹤將顯示正在創建2000和插座(永不關閉的),爲每個請求。我希望只有10個套接字被創建並在必要時重用。

有沒有辦法設置事情,所以unix套接字保持活着並重復使用TCP套接字相同的方式?

+0

Keepalive用於防止遠程連接超時,但unix套接字對於計算機是本地的,操作系統知道兩端發生了什麼,因此,不,套接字不具有或需要keepalive。 – Rob

回答

0

此行爲在版本v8.7.0之前的Node中被破壞。修復了Unix域套接字的保持活動的commit by user bengl被放入了v8.7.0版本。這個版本是在6天前發佈的。

0

request文檔:

請注意,如果您要發送一個循環多次請求,並創建多個新池對象,maxSockets不會像預期的那樣。要解決這個問題,可以使用request.defaults和池選項,或者在循環外部使用maxSockets屬性創建池對象。

因此,您似乎需要在循環外部創建池對象,以便按照您的預期重新使用套接字。

+0

這種情況下的代碼不會創建多個新的池對象,每次都會使用全局代理作爲池。另外,它對於TCP上的常規HTTP很有用。 –

+0

@allenluce你可以發佈你從套接字捕獲的TCP響應嗎?我想知道是否錯誤地發送了保持活動狀態。 –

+0

保持活動頭正在發送時,它也持續插座。我可以在系統調用追蹤中看到,socket()只是被調用了幾次而不是每個連接。檢查我剛剛發佈的答案。 –