サーバーから一連の tcp クライアントにキープアライブを送信しようとしています。応答に対するサーバーの負荷を軽減するために、キープアライブを分散させたいと考えています。
3000 の tcp クライアントがあり、60 秒のキープアライブ間隔がある場合、キープアライブ メッセージを 60 秒以上ずらして、毎秒 50 個のキープ アライブを送信する必要があります。
仮定:
- 多くの TCP 接続 (数千単位)
- TCP 接続は持続し、少なくとも数時間はアクティブであると予想されます
- サーバーは、クライアントが接続されなくなった場合、たとえば 60 秒以内に知る必要があります
- サーバーとクライアントからのその他の情報が送受信されます
- クライアントからのキープアライブリターンメッセージには有用なデータが含まれています(UDPを除外すると思います)
現在、私の考えは、特定の接続自体へのIDマッピングを使用して、標準のjavascriptオブジェクトとしてtcp接続を保存することです。次に、毎秒、このオブジェクトのキーの配列を取得し、これらの一部にキープアライブを送信します。
これは良いアプローチですか?私が考慮すべきより良いアプローチやその他のことはありますか?
問題に対する私の最初の刺し傷のコード例:
var KEEP_ALIVE_INTERVAL = 1000; // time between groups
var KEEP_ALIVE_CYCLE = 3; // number of groups
var tcp_conns = {
a:"a",
b:"b",
c:"c",
d:"d",
e:"e",
f:"f",
g:"g",
h:"h",
i:"i"
};
var intervalCounter = 0;
setInterval(function() {
console.log("sending keep alives intervalCounter="+intervalCounter);
var numConns = Object.keys(tcp_conns).length;
var connFactor = Math.ceil( numConns / KEEP_ALIVE_CYCLE );
var lowerLimit = connFactor*intervalCounter-1;
var upperLimit = connFactor*(intervalCounter+1);
console.log("connFactor="+connFactor+", limits=["+lowerLimit+","+upperLimit+"]");
// Is this even async???
var keys = Object.keys(tcp_conns)
for (var i = 0; i < keys.length; i++) {
if(i>lowerLimit && i<upperLimit){
var key = keys[i]
var val = tcp_conns[key]
console.log(" id="+key+" => "+val);
}
}
intervalCounter++;
if(intervalCounter==KEEP_ALIVE_CYCLE){
intervalCounter=0;
}
}, KEEP_ALIVE_INTERVAL);