38

だから私はnode.jsとsocket.ioを使用しています。テキスト ボックスの内容を受け取り、それを node.js サーバーに送信するこの小さなプログラムがあります。次に、サーバーはそれを他の接続されたクライアントに中継します。チャットサービスのようなものですが、正確ではありません。

とにかく、ユーザーが 2 ~ 10k 相当のテキストを入力して送信しようとした場合はどうなるでしょうか。試してみて自分で確認できることはわかっていますが、エミットで実行できるデータ量の実用的でベストプラクティスの制限を探しています。

4

3 に答える 3

103

v3 の時点で、socket.io のデフォルトのメッセージ制限は 1 MB です。メッセージがそれよりも大きい場合、接続は強制終了されます。

maxHttpBufferSizeオプションを指定することでこのデフォルトを変更できますが、次のことを考慮してください (最初に書かれたのは 10 年以上前ですが、まだ関連があります)。

Nodeと socket.ioには組み込みの制限はありません。心配しなければならないのは、メッセージのサイズ、1 秒あたりに送信されるメッセージの数、接続されているクライアントの数、およびサーバーが利用できる帯域幅の間の関係です。つまり、簡単な答えはありません。

10 kB のメッセージを考えてみましょう。10 台のクライアントが接続されている場合、サーバーがプッシュしなければならないデータは 100 kB になり、これは完全に合理的です。クライアントを追加すると、要求が急速に厳しくなります: 10 kB * 5,000 クライアント = 50 MB。

もちろん、プロトコル オーバーヘッドの量も考慮する必要があります。パケットごとに、TCP は最大 20 バイト、IP は 20 バイト、イーサネットは 14 バイトを追加し、合計 54 バイトになります。MTU が 1500 バイトであると仮定すると、クライアントごとに 8 パケットが表示されます (再送信は無視されます)。これは、8*54=432 バイトのオーバーヘッド + 10 kB ペイロード = 1 クライアントあたり 10,672 バイトをネットワーク経由で送信することを意味します。

10.4 KB * 5000 クライアント = 50.8 MB。

100 Mbps のリンクでは、リンクを飽和させることができる場合、10 kB のメッセージを 5,000 のクライアントに配信するのに理論上の最小時間は 4.3 秒です。もちろん、ドロップされたパケットや破損したデータが再送信を必要とする現実の世界では、さらに時間がかかります。

10 kB を 5,000 クライアントに送信するのに 8 秒という非常に控えめな見積もりでも、メッセージが 10 ~ 20 秒ごとに届くチャット ルームではおそらく問題ありません。

実際には、重要性の順にいくつかの質問に行き着きます。

  1. サーバーで使用できる帯域幅はどれくらいですか?
  2. 何人のユーザーが同時に接続されますか?
  3. 1 分間に送信されるメッセージの数は?

これらの質問に答えると、インフラストラクチャがサポートするメッセージの最大サイズを判断できます。

于 2012-10-19T16:38:50.797 に答える
3

2〜10kで問題ありません。強制的な制限などはありません。それは帯域幅と実用性に帰着します..10kは物事の壮大な計画では小さいですが、それが上限である場合は問題ないはずです.

于 2012-10-19T15:40:37.070 に答える