nginx WebサーバーのNchanモジュール。 Websocket、EventSource(サーバー送信イベント)、ロングポーリングの使用

この記事では、非推奨モジュールNGiNX_HTTP_Push_Moduleに代わるnginx WebサーバーのNchanモジュールの機能の概要を説明します。 Nchanモジュールは、Websocket、EventSource(Server-Sent Events)、Long-Pollingなどのメッセージ送信の基本テクノロジーをサポートしています。 水平スケーリングでは、redisサーバークラスターが使用されます。



Websocketテクノロジーは、まだ一般的なWebブラウザーで100%カバーされていません。 統計を参照してください。 はい、サポートしていないWebブラウザーは6%のみです。 ただし、クライアントが契約にOpera-miniサポート条項を含めている場合、ロングポーリングのフォールバックはできなくなります。 Websocketテクノロジーの可用性を低下させるもう1つのポイントがありますが、統計は見つかりません。 たぶん誰かがそれをどこで手に入れるか教えてくれるでしょう。 システム管理者がセキュリティ上の理由で設定したり、負荷を軽減することを決定した場合、Websocketは一部のDDoS保護システム、法的制限のある国のプロバイダー、一部のモバイルインターネットプロバイダー、および企業ファイアウォールを介してインターネットにアクセスする際のフィルターをサポートしない場合があります。



Websocketテクノロジーのもう1つの重要な問題は、水平スケーリングです。 クラスターモードセクションからpm2ドキュメント(node.jsのプロセスマネージャー)を引用します。

アプリケーションを無国籍化する



アプリケーションがステートレスであることを確認してください。つまり、セッションにローカルデータが保存されていないことを確認してください。たとえば、sessions / websocket connections 、session-memoryなどです。 Redis、Mongo、または他のデータベースを使用して、プロセス間で状態を共有します。



効率的で生産可能な状態のないステートレスアプリケーションの作成方法に関する別のリソースは、Twelve Factor Applicationマニフェストです。
つまり、水平スケーリングの場合(たとえば、node.jsアプリケーションが同じサーバーで複数のコアで実行されている場合でも)、クラスター全体の共通メッセージバスを編成するために追加のメカニズムを使用する必要があります。



そして最後に、新しいプレーヤーが登場しました-これはサーバー送信イベントテクノロジーです。 ブラウザのサポート統計は、Websocketの統計とほぼ同じです(つまり、非常に優れています)。 統計を参照してください 。 しかし、私にとっては、配布の適用はまだ初期レベルにあるようです(つまり、なし)。 Nchanの利点は、3つの技術すべてのアプリケーションがクライアントとサーバーの両方に対して透過的であることです。



Nchanモジュール 、nginx-extrasアセンブリに含まれています。 読者の便宜のために、 リポジトリに docker-composeの設定を配置しまし



クライアントには、ライブラリhttps://github.com/slact/nchan.jsがあります 。 どのプロトコルを使用するかを明示的に、または優先度順に決定できます。 3つのプロトコルがサポートされています:Websocket、EventSource(サーバー送信イベント)、クライアントおよびサーバーに対して透過的なロングポーリング。



var opt = { subscriber: 'websocket', // 'longpoll', 'eventsource', or 'websocket' //or an array of the above indicating subscriber type preference reconnect: undefined, // undefined or 'session' or 'persist' //if the HTML5 sessionStore or localStore should be used to resume //connections interrupted by a page load shared: undefined, // true, or undefined //share connection to same subscriber url between browser //windows and tabs using localStorage. In shared mode, //only 1 running subscriber is allowed per url per window/tab. } var sub = new NchanSubscriber('/sub?id=mytopic', opt); sub.on("message", function(message, message_metadata) { console.log(message) console.log(message_metadata) // message is a string // message_metadata is a hash that may contain 'id' and 'content-type' }); sub.start(); // begin (or resume) subscribing
      
      





サーバーで、メッセージをリッスンしてトピックに送信するURLを構成する必要があります。



  nchan_redis_url "redis://redis"; nchan_storage_engine "redis"; nchan_message_buffer_length 100; nchan_message_timeout 5s; location = /sub { nchan_subscriber; nchan_channel_id $arg_id; nchan_use_redis on; } location = /pub { nchan_publisher; nchan_channel_id $arg_id; nchan_use_redis on; }
      
      





メッセージがサーバーによって非常に適切に保存されることは少し驚きでした。したがって、メッセージの保存時間を5秒に設定して、ページがリロードされたときに、最初から一気に配信されないようにしました。 デフォルト値は3600秒です。



最後に、簡単なPOSTリクエストでトピックにメッセージを送信できます



 curl --request POST --data "test message" http://localhost:8003/pub?id=mytopic
      
      





apapacy@gmail.com

2018年5月7日



All Articles