Nginx は 2 つの socket.io サーバーをプロキシします。 socket.ioの動作モードはポーリングからwebsocketにアップグレードされました 現象 nginx 経由でサービスをリクエストすると、大量の 400 エラーが発生していました。Websocket にアップグレードできる場合もあれば、エラーが報告され続ける場合もありました。ただし、 分析する シド SID が私たちの問題の鍵です。最初に接続を作成するとき (ポーリング モードは長い接続をシミュレートします)、クライアントは次のような要求を開始します。 https://***/?EIO=3&transport=polling&t=1540820717277-0 メッセージを受信した後、サーバーはオブジェクトを作成し、それを接続にバインドし、セッションをマークするための sid (セッション ID) を返します。セッションとは何を意味するのでしょうか? セッションとは一連のインタラクションであり、これらのインタラクションは相互に関連しています。このシナリオでは、次の http リクエストが来たときに、以前に理論上の長い接続にバインドされていたオブジェクトを見つける必要があります (ここでは Websocket がないので、理論上のものです)。 HTTP リクエストはステートレスであり、各リクエストは独立していることがわかっているので、socket.io ではこれを実現するために SID を導入しています。リクエストを受信すると、サーバーは sid を生成し、応答を確認します。 次のようにコードをコピーします。 {"sid":"EoGaL3fRQlpTOaLp5eST","アップグレード":["websocket"],"pingInterval":8000,"pingTimeout":10000} 後続の各リクエストでは、Websocket リクエストを確立するためのリクエストも含め、この sid を送信する必要があります。したがって、sid はポーリングとポーリングを Websocket にアップグレードするための鍵となります。この後のリクエストは次のようになります。 https://***/?EIO=3&transport=polling&t=1540820717314-1&sid=EoGaL3fRQlpTOaLp5eST または wss://***/?EIO=3&transport=websocket&t=1540820717314-1&sid=EoGaL3fRQlpTOaLp5eST そこで疑問になるのが、リクエストに含まれる SID がサーバーによって生成されなかった場合はどうなるかということです。サーバーはそれを認識せず、400を返し、 無効なSID これが私たちが遭遇した問題です。nginx のデフォルトの負荷分散戦略はポーリングなので、リクエストは SID を生成したマシンではないマシンでヒットする可能性があります。この時点で、400 を受け取ります。運が良ければ、元のマシンでもヒットする可能性があります。さらに運が良ければ、Websocket 接続が確立されるまで持続することもできます。 解決する ここに2つの解決策があります
どちらの選択肢にも長所と短所があります。 2 番目は明らかで、Websocket をサポートしていない古いブラウザやクライアントは動作しません。最初の問題は、より隠れたものです。マシンを追加または削除するとどうなるか想像してみてください。このとき、ip_hash 戦略のモデルが変更され、以前の接続はすべて無効になります。ただし、マイクロサービスの場合、スケーリングは非常に頻繁に行われる操作であり (特に製品が開発段階にある場合)、このような損失のあるスケーリングはおそらく受け入れられません。 まとめると、websocket を直接使用することをお勧めします。結局のところ、websocket をサポートしていない古いバージョンはわずかな割合を占めており、最初にポーリングするよりも時間がかかりません。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Vue SPA ファースト スクリーン最適化ソリューション
>>: mysql data_dirの変更によって発生するエラー問題を解決する
この記事では、参考までにVueのファイルのアップロードとダウンロードの具体的なコードを紹介します。具...
目次1. コンテンツの概要2. 文字セットと文字順序の概念と関係3. MySQL でサポートされてい...
この記事では、Reactでページング効果を実現するための具体的なコードを参考までに紹介します。具体的...
目次1. 自己増分値はどこに保存されますか? 2. 自己価値修正メカニズム3. 自動増分値を変更する...
この記事の例では、Baidu検索ボックスを実装するためのJSの具体的なコードを参考までに共有していま...
今日、私は <a href="#13"></a> につい...
この記事では、参考までにMySQL 8.0に接続できないJavaの問題をまとめて紹介します。具体的な...
Windows システムと比較して、Linux システムは多数の豊富なコマンドライン ツールを提供し...
Kubernetes は、アプリケーションの移植性とハイブリッド クラウド/マルチクラウドの展開をサ...
1. 機能: 親コンポーネントが子コンポーネントの指定された位置に HTML 構造を挿入できるように...
通常、清明節、国哀悼日、大地震の日、影響力のある偉人の死去または命日には、ウェブマスターとして、故人...
目次序文デザイン成し遂げるまとめ序文最近は、いつも延々とスワイプしています。 Weibo をチェック...
環境の紹介: Ubuntu Server 16.04.2+MySQL 5.7.17 コミュニティ サ...
このキー属性の機能は何ですか?まずは公式の説明を見てみましょう。 kekey 属性は主に、新しいノー...
WebRTC は、Web Real-Time Communication の略で、Web リアルタイ...