2017年12月まで早速、WebSocketは(実質的に)すべてのブラウザーでサポートされており、その使用は非常に一般的です。
ただし、これはWebSocketがAJAXを完全に置き換えることはできなかったことを意味しません。特に、HTTP / 2の適応が増加しているためです。
簡単に言えば、WebSocketを使用している場合でも、AJAXはほとんどのRESTアプリケーションに最適です。しかし、神は詳細にいるので...:
ポーリング用のAJAX?
ポーリング(またはロングポーリング)にAJAXを使用することはなくなりつつあります(実際にそうなるはずです)が、2つの理由(主に小規模なWebアプリ)のために引き続き使用されています。
多くの開発者にとって、特にバックエンドのコーディングと設計に関しては、AJAXはコーディングが簡単です。
HTTP / 2を使用すると、AJAX(新しい接続の確立)に関連する最も高いコストが排除され、特にデータの投稿とアップロードに関して、AJAX呼び出しのパフォーマンスが向上しました。
ただし、WebSocketプッシュはAJAXよりもはるかに優れています(ヘッダーを再認証または再送信する必要はなく、「データなし」のラウンドトリップなども必要ありません)。これは何度も議論されました。
RESTのAJAX?
AJAXのより良い使用法はREST API呼び出しです。この使用により、コードベースが簡略化され、Websocket接続がブロックされるのを防ぎます(特に中規模のデータアップロードの場合)。
REST API呼び出しとデータのアップロードにAJAXを使用することには、多くの説得力のある理由があります。
AJAX APIは実質的にREST API呼び出し用に設計されており、非常に適しています。
AJAXを使用したREST呼び出しとアップロードは、クライアントとバックエンドの両方で、コーディングが非常に簡単です。
データペイロードが増加すると、メッセージの断片化/多重化ロジックがコーディングされていない限り、WebSocket接続がブロックされる可能性があります。
アップロードが単一のWebsocket send
呼び出しで実行される場合、アップロードが完了するまでWebsocketストリームをブロックする可能性があります。これにより、特に低速のクライアントではパフォーマンスが低下します。
一般的な設計では、Websocketを介して転送される小さなBidiメッセージを使用し、RESTおよびデータのアップロード(クライアントからサーバー)は、AJAXの使いやすさを利用してWebsocketのブロックを防ぎます。
ただし、大規模なプロジェクトでは、Websocketによって提供される柔軟性と、コードの複雑さとリソース管理のバランスがWebsocketを支持するバランスを傾けます。
たとえば、Websocketベースのアップロードでは、接続が切断されて再確立された後に大きなアップロードを再開する機能を提供できます(アップロードしたい5GBの映画を覚えていますか?)。
アップロードの断片化ロジックをコーディングすることで、中断されたアップロードを簡単に再開できます(難しい部分はコーディングされていました)。
HTTP / 2プッシュについてはどうですか?
おそらく、HTTP / 2プッシュ機能がWebsocketに取って代わらない(そしておそらくできない)ことを付け加えておきます。
これについては前に説明しましたが、単一のHTTP / 2接続がブラウザ全体(すべてのタブ/ウィンドウ)にサービスを提供するため、HTTP / 2によってプッシュされたデータは、どのタブ/ウィンドウに属しているかがわかりません。 Websocketの特定のブラウザタブ/ウィンドウにデータを直接プッシュする機能を置き換える容量を排除します。
Websocketは小さな双方向データ通信に最適ですが、AJAXには、特に大きなペイロード(アップロードなど)を検討する場合に、多くの利点があります。
そしてセキュリティ?
まあ、一般的に、プログラマーに提供される信頼と制御が多ければ多いほど、ツールは強力になり、セキュリティ上の懸念が高まります。
セキュリティはブラウザのコードに組み込まれているため、AJAXの方が有利です(これは問題になることもありますが、依然として存在します)。
一方、AJAX呼び出しは「中間者」攻撃の影響を受けやすくなりますが、Websocketのセキュリティ問題は、通常、アプリケーションコードのバグであり、セキュリティ上の欠陥がありました(通常、バックエンドの認証ロジックにあります)。
個人的には、これがそれほど大きな違いであるとは思いませんが、特にあなたが何をしているのかを知っている場合は、WebSocketの方が少し良いと思います。
私の謙虚な意見
私見、私はREST API呼び出し以外のすべてにWebsocketを使用します。可能な場合は、断片化してWebSocket経由で送信するビッグデータのアップロード。
ポーリング、私見は非合法である必要があります。ネットワークトラフィックのコストは恐ろしいものであり、Websocketプッシュは新しい開発者であっても管理するのに十分簡単です。