2016-08-24 4 views
0

をするための最良の方法うーん、私は次のように私の問題を低減していますのWebSocket - スペースアウトサーバの応答

私は2秒の間隔で、私のWebSocketクライアント(ブラウザ)への応答を送信するnode.jsサーバーを持っています。応答を受け取るクライアントコードは次のとおりです。

socket.onmessage = function (message) { 
    //display message 
}   

ほとんどの場合、クライアントで少なくとも2秒間応答を受け取ることができます。しかし、ネットワークの接続不良やサーバーの負荷が高いことが原因で、サーバーからの応答が激しくなることがあります。たとえば、2秒間に1回の応答ではなく、6秒間に3回の応答を同時に取得します。

少なくとも2秒の遅延が保存されるように、どのように私は、クライアントの状況を扱うことができますか?

1つのオプションは、クライアントのすべての応答をキューに入れ、その後、定期的にキューをチェックタイマーを持つことです。より良い方法がありますか?

また、関数はonmessageスレッドセーフですか?つまり、コードブロックの実行中にサーバーからの新しい応答がブロックされますか?

答えて

0

あり(あなたが労働者を使用している場合を除き)、ブラウザ上でJavaScriptの実行1つのスレッドのみですので、スレッドセーフです。

しかし、イベントループは、あなたのonMessageハンドラが戻るまでブロックされ、それらが処理されるまで、他のすべてのメッセージは、イベントキューにキューイングされます。

メッセージが到着するとすぐにキューに追加し、2秒ごとに間隔を空けてアイテムをキューから取り出して処理することができます。あなたが遅延を得れば

しかし、突然、あなたは残さないとだけ大きくなるん恒久的な遅延がありますか?おそらく、クライアントで2秒間隔が必要な理由について、より多くの情報を提供することができます。

hereのソリューションの1つは、UI更新の速度を制限するために使用できるレート制限待ち行列関数呼び出しを提供することがあります。サーバよりも速度を速くして、より大きなキューに追いつけるようにしてください。

+0

クライアントは、サーバーからの応答ごとにUIを更新します。また、ユーザーが変更を確認するために少し時間がかかることが重要です。 – Kamil

+0

機能の使用を許可するhttp://stackoverflow.com/questions/23072815/throttle-javascript-function-calls-but-with-queuing-dont-discard-callsに記載されているような機能の使用をお勧めしますキューに入れられ、レート制限されます。ただし、この方法を使用する場合は、遅れをサーバーよりもわずかに小さくして、それに追いつくことができるようにしてください –

関連する問題