この記事では、非推奨モジュール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',
サーバーで、メッセージをリッスンしてトピックに送信する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日