REST APIを置き換えるWebsocket API?


101

主な機能がWebSocketまたはロングポーリングを介してリアルタイムで動作するアプリケーションがあります。

ただし、サイトのほとんどはRESTfulな方法で記述されており、将来のアプリケーションや他のクライアントにとっては便利です。ただし、RESTから離れて、すべてのサイト機能のWebSocket APIへの移行を考えています。これにより、リアルタイム機能をサイトのすべての部分に統合しやすくなります。これにより、アプリケーションやモバイルクライアントの構築が難しくなりますか?

一部の人々はすでにこのようなことをしていることがわかりました:SocketStream


2
@Stegiロングポーリングはフォールバックとして十分に機能しますが、それほど心配する必要はありません。
ハリー

2
7年後のハリー、あなたにとってそれはどのように機能しましたか?私もその方向に移動したいので、疑問に思います。@ハリー
ドミトリークドリャ

2
@DmitryKudryavtsev私はそうしなかった 従来の方法は私にとってはうまくいき、それほど難しくはありませんでした。
ハリー

回答:


97

ここでの他の回答にメリットがないと言うのは言うまでもなく、それらはいくつかの良い点を示します。ただし、一般的なコンセンサスに反して、リアルタイム機能だけでなくWebSocketに移行することは非常に魅力的であることに同意します。

私はアプリをRESTfulアーキテクチャからWebSocketを介してより多くのRPCスタイルに移行することを真剣に検討しています。これは「おもちゃのアプリ」ではなく、リアルタイムの機能だけを話しているわけではないので、予約は必要です。しかし、私はこの経路を進むことで多くの利点を見出し、それが例外的な解決策になることが判明する可能性があると感じています。

私の計画は、DNodeSocketIO、およびバックボーンを使用することです。これらのツールを使用すると、RPCスタイルの関数を呼び出すだけで、バックボーンモデルとコレクションをクライアントとサーバーの間でやり取りできます。RESTエンドポイントの管理、オブジェクトのシリアライズ/デシリアライズなどは不要です。私はまだソケットストリームを扱っていませんが、チェックする価値があるようです。

これが良い解決策であると断定できるまでにはまだ長い道のりがあり、すべてのアプリケーションに最適な解決策ではないことは確かですが、この組み合わせは非常に強力であると確信しています。リソースをキャッシュする機能を失うなど、いくつかの欠点があることを認めます。しかし、私は利点がそれらを上回ると感じています。

このタイプのソリューションの探索の進捗状況に興味があります。githubの実験がある場合は、私にそれらを教えてください。まだありませんが、お早めに。

以下は、私が収集している「後で読む」リンクのリストです。私はそれらの多くをスキミングしただけなので、それらがすべて価値があることを保証することはできません。しかし、うまくいけば、いくつかは助けるでしょう。


ExpressでSocket.IOを使用するための素晴らしいチュートリアル。高速セッションをsocket.ioに公開し、認証されたユーザーごとに異なる部屋を持つ方法について説明します。

認証、Joyentホスティングなどを使用したnode.js / socket.io / backbone.js / express / connect / jade / redisのチュートリアル:

Backbone.jsでPusherを使用するためのチュートリアル(Railsを使用):

クライアントにbackbone.jsを使用し、サーバーにexpress、socket.io、dnodeを使用してnode.jsでアプリケーションをビルドします。

DNodeでのバックボーンの使用:


1
私はちょうど少数のより多くの考えを関連する質問に答えて含ま:stackoverflow.com/questions/4848642/...
Tauren

11
「私はこれが確かに良い解決策であると断言できるようになるまでにはまだ長い道のりがあります」-好奇心だけで、これは本当に良い解決策でしたか?:D
inf3rno 2013

7
@Taurenに返信してください。私はあなたが今何を言わなければならないか非常に興味があります。
No_name 2014

4
@タウレン私はこれがどのようにうまくいったかについても興味がありますか?
Kurren

57

HTTP RESTとWebSocketは大きく異なります。HTTPはステートレスなので、Webサーバーは何も知る必要がなく、Webブラウザーとプロキシでキャッシュを取得します。WebSocketを使用する場合、サーバーはステートフルになり、サーバー上のクライアントに接続する必要があります。

要求/応答通信とプッシュ

サーバーからクライアントにデータをプッシュする必要がある場合にのみWebSocketを使用します。その通信パターンはHTTPに含まれていません(回避策のみ)。PUSHは、他のクライアントによって作成されたイベントを、接続されている他のクライアントが利用できるようにする必要がある場合などに役立ちます。または、Webサイトが何かを監視している場合、サーバーは常にクライアントにデータをプッシュします。

サーバーからデータをプッシュする必要がない場合は、通常、ステートレスHTTP RESTサーバーを使用する方が簡単です。HTTPは単純なRequest-Reply通信パターンを使用します。


5
これまでに選択肢がなかったため、一方向のパターンに非常に慣れています。しかし、私のアプリの開発が進むにつれ、プッシュテクノロジーを使用する場所が増えるほど、応答性が向上し、アプリの魅力が増すことがわかります。
ハリー

私のアプリは、友達のリストと、例えば友達のポイント数を表示します。リアルタイムで更新してみませんか。ユーザーが友達の進行状況を確認できる場合は、追いつきたいと思う傾向があります。頻繁に正確に変更されるわけではありませんが、リアルタイムで更新しないと少し混乱する可能性があるほど変更されている特定のドキュメントモデルがあります。ある時点で、コードの確認を開始するプッシュ更新を使用することで、サイトの十分なメリットが得られます。その半分はRESTに関するもので、残りの半分はソケットに関するものです。
ハリー

3
これは、通知/コマンドをWebアプリケーションにプッシュするためにのみWebSocketを使用するオプションです(パラメーター付きのgetUpdateまたはrefreshObjectWithIdなど)。このコマンドは、Webアプリケーション(クライアント)で分析され、WebSocketを介してデータ自体を転送する代わりに、特定のデータを取得するためのRESTリクエストが続く場合があります。
ビーチウォーカー、

2
プッシュだけでなく、WebSocketがREST呼び出しよりも簡単になる理由はたくさんあります。websocket.org/quantum.html
BT

WebSocketはすばらしいものであり、クライアントメッセージへの応答だけでなく、サーバーを解放していつでもクライアントデータを送信できます。WebSocketはメッセージベースのプロトコルを実装しているため、クライアントはいつでもメッセージを受信でき、特定のメッセージを待機している場合は、後で処理するために他のメッセージをキューに入れたり、キューに入れられたメッセージを並べ替えたり、アプリの状態に応じてプッシュされたメッセージを無視したりできます。別のRESTベースのアプリケーションを再度作成することは決してありません。Flashは、オープンソースのAS3ベースのWebSocket実装と、ExternalInterface。(addCallback / call)メソッドを介したブラウザーへのフォールバックにより、これも簡単にします。
Triynko 2013

40

すべてのサイト機能をWebSocket APIに移行することを考えています

いいえ、できません。両方のモデルをサポートしていても害はありません。特にサーバーがリアルタイムの通知を送信する場合は、一方向通信/単純な要求にはRESTを使用し、双方向通信にはWebSocketを使用します。

WebSocketRESTful HTTPよりも効率的なプロトコルですが、以下の領域ではWebSocket よりもRESTful HTTPスコアが高くなっています。

  1. 作成/更新/削除リソースは、HTTPに対して適切に定義されています。WebSocketの場合、これらの操作を低レベルで実装する必要があります。

  2. WebSocket接続は、HTTP接続が水平に拡大するのに対して、単一サーバーでは垂直に拡大します。WebSocket水平スケーリングには、非標準ベースの独自のソリューションがいくつかあります。

  3. HTTPには、キャッシング、ルーティング、多重化、gzip圧縮などの優れた機能がたくさんあります。Websocketを選択した場合、これらはWebsocketの上に構築する必要があります。

  4. 検索エンジン最適化は、HTTP URLに対して適切に機能します。

  5. すべてのプロキシ、DNS、ファイアウォールはまだWebSocketトラフィックを完全には認識していません。それらはポート80を許可しますが、最初にそれをスヌーピングすることによってトラフィックを制限するかもしれません。

  6. WebSocketによるセキュリティは、オールオアナッシングアプローチです。

詳細については、この記事をご覧ください。


3
これが最良の答えです。
MattWeiler 2017

1
トピックのトップアンサー
Sanandrea 2017

10

TCP(WebSockets)をメインのWebコンテンツ配信戦略として使用できる唯一の問題は、TCPを使用してWebサイトのアーキテクチャとインフラストラクチャを設計する方法に関する資料がほとんどないことです。

したがって、他の人の過ちから学ぶことはできず、開発は遅くなります。また、「試行錯誤した」戦略でもありません。

もちろん、HTTPのすべての利点も失われます(ステートレスであること、およびキャッシングがより大きな利点です)。

HTTPは、Webコンテンツを提供するために設計されたTCPの抽象概念であることに注意してください。

また、SEOと検索エンジンはWebSocketを実行しないことを忘れないでください。だからあなたはSEOを忘れることができます。

個人的にはリスクが高すぎるため、これはお勧めしません。

Webサイトの提供にWSを使用せず、Webアプリケーションの提供に使用する

しかし、もしあなたがおもちゃや個人のウェブサイトを持っているなら、ぜひそれのために行ってください。それを試してください、最先端です。企業や会社にとって、これを行うリスクを正当化することはできません。


7

私は少しのレッスンを学びました(難しい方法)。私は、Ubuntu AWS EC2クラウドサービス(強力なGPUを使用)で実行される数値計算アプリケーションを作成しました。その進行状況をリアルタイムで監視するためだけにフロントエンドを作成したいと考えていました。リアルタイムデータが必要なため、更新をプッシュするためにWebSocketが必要であることは明らかでした。

それは概念実証から始まり、素晴らしい働きをしました。しかし、それを一般に公開したい場合は、ユーザーセッションを追加する必要があったため、ログイン機能が必要でした。そして、どのように見ても、websocketはどのユーザーを処理するかを知る必要があるため、websocketを使用してユーザーを認証するショートカットを採用しました。当たり前のようで便利でした。

実際には、接続を信頼できるものにするために静かな時間を費やす必要がありました。安価なWebSocketチュートリアルから始めましたが、接続が切断されたときに実装が自動的に再接続できないことがわかりました。socket-ioに切り替えると、すべてが改善されました。Socket-ioは必須です!

とはいえ、正直なところ、いくつかの素晴らしいsocket-io機能を見逃してしまったと思います。Socket-ioにはもっと多くの機能があり、最初の設計でそれを考慮に入れれば、より多くのことを得ることができると私は確信しています。対照的に、古いwebsocketをsocket-ioのwebsocket機能に置き換えただけで、それで終わりです。(部屋なし、チャンネルなし...)再設計により、すべてがより強力になった可能性があります。しかし、そのための時間はありませんでした。これは、次のプロジェクトで覚えておくべきことです。

次に、より多くのデータ(ユーザー履歴、請求書、トランザクションなど)の保存を開始しました。すべてをAWS dynamodbデータベースに格納し、AGAINでは、socket-ioを使用してCRUD操作をフロントエンドからバックエンドに通信しました。私たちはそこで間違った方向に進んだと思います。それは間違いでした。

  • それは、Amazonのクラウドサービス(AWS)がRESTfulアプリケーション用の優れたロードバランシング/スケーリングツールを提供していることを知った直後のことです
  • CRUD操作のハンドシェイクを実行するために多くのコードを記述する必要があるという印象を受けました。
  • 最近、Paypal統合を実装しました。私たちはなんとかそれを機能させることができました。しかし、繰り返しになりますがすべてのチュートリアルではRESTful APIを使用しています。ウェブソケットで実装するために、サンプルを書き直したり再考したりする必要がありました。それでもかなり高速に動作しました。しかし、流れに逆らっているように感じます。

以上のことを踏まえて、来週ライブを行います。私たちは時間内にそこに着きました、すべてがうまくいきます。そして、それは高速ですが、スケーリングしますか?


私たちがこの決定を自分たちでしようとしているのだろうと思っただけで、AWSでうまくスケーリングできましたか?
Gabe

1
@Gabeのノードは明らかに、安価なawsインスタンスで数百のsocket-io接続を簡単に取得できます。パフォーマンスの問題はまだ確認されていません。ただし、奇妙な影響の1つは、一度Webサイトにアクセスした後、Webサイトをタブで開いたままにしていて、接続を使用し続けることです。(そしてそれは携帯電話でよく起こります)。したがって、アイドル状態のユーザーを排除するためのメカニズムが少なくとも必要です。ただし、パフォーマンスにまったく影響がないため、まだそのための努力はしていません。-だから、まだ召喚は必要なかった。
bvdb

4

両方の使用を検討します。各テクノロジーにはメリットがあり、すべてのソリューションに適したサイズはありません。

仕事の分離はこのようになります:

  1. WebSocketは、セッションが必要なサーバーと通信するアプリケーションの主要な方法です。これにより、古いブラウザに必要な多くのハックが排除されます(問題は、これを排除する古いブラウザのサポートです)。

  2. RESTful APIは、ブラウザキャッシュの恩恵を受けるセッション指向ではない(つまり、認証は不要)GET呼び出しに使用されます。この良い例は、Webアプリケーションで使用されるドロップダウンの参照データです。しかしながら。より頻繁に変更することができます...

  3. HTMLおよびJavaScript。これらはwebappのUIを構成します。これらは通常、CDNに配置されることでメリットがあります。

  4. WSDLを使用したWebサービスは、メッセージとデータの受け渡しのための明確に定義された標準を提供するため、エンタープライズレベルおよび企業間通信の最良の方法です。主に、これをDatapowerデバイスにオフロードして、Webサービスハンドラーにプロキシします。

これはすべて、SSLを介したセキュアソケットを使用できるHTTPプロトコルで発生します。

ただし、モバイルアプリケーションの場合、websocketは切断されたセッションに再接続できず(接続を閉じた後にwebsocketに再接続する方法)、それを管理することは簡単ではありません。したがって、モバイルアプリの場合は、REST APIとポーリングをお勧めします

WebSocketsとRESTを使用するときに注意すべきもう1つのことは、スケーラビリティです。WebSocketセッションは引き続きサーバーによって管理されます。RESTful APIが適切に実行されるとステートレス(つまり、管理する必要のあるサーバーの状態がないこと)であるため、スケーラビリティーは垂直よりも水平に(安価に)向上します


2

サーバーからの更新が必要ですか?

  • はい:Socket.io
  • 休みなしで

Socket.ioの欠点は次のとおりです。

  • スケーラビリティ:WebSocketには、オープンコネクションと、Webスケールのための非常に異なるOpsセットアップが必要です。
  • ラーニン:ラーニンの時間に制限はありません。物事は成し遂げられなければならない!

プロジェクトでは引き続きSocket.ioを使用しますが、RESTでうまく機能する基本的なWebフォームには使用しません。


1

WebSocket(またはロングポーリング)ベースのトランスポートは、主にサーバーとクライアント間の(ほぼ)リアルタイム通信に使用されます。チャットやある種のリアルタイムフィードなど、これらの種類のトランスポートが必要となるシナリオは多数ありますが、一部のWebアプリケーションのすべての部分を必ずしもサーバーと双方向で接続する必要はありません。

RESTはリソースベースのアーキテクチャであり、よく理解されており、他のアーキテクチャに比べて独自の利点があります。WebSocketは、リアルタイムでデータのストリーム/フィードにさらに傾斜します。これにより、リソースとフィードを優先または区別するためにサーバーベースのロジックを作成する必要があります(RESTを使用しない場合)。

このトランスポートがより広く普及し、データタイプ/フォームにとらわれない配信の形式でよりよく理解/文書化されるようになると、将来的にはsocketstreamのようなWebSockets中心のフレームワークがさらに増えると思います。ただし、RESTが多くのユースケースやシナリオで必ずしも必要とされない機能を提供するからといって、RESTを置き換える/すべきであるとは限りません。


-1

それは良い考えではありません。標準はまだ確定されておらず、サポートはブラウザーなどによって異なります。これを行う場合、フラッシュやロングポーリングなどにフォールバックする必要があります。将来的には、おそらくそれはまだ行われませんサーバーはすべてのユーザーに接続を開いたままにすることをサポートする必要があるため、多くの意味です。代わりに、ほとんどのWebサーバーは、要求への迅速な応答と可能な限り迅速なクローズに優れているように設計されています。オペレーティングシステムでさえ、多数の同時接続に対応するように調整する必要があります(各接続は、より多くの一時的なポートとメモリを使用します)。できるだけ多くのサイトでRESTを使用してください。


はい、ほとんどのウェブサーブはHTTPに優れています。しかし、node.jsはWebサーバーではなく、ioライブラリです。TCPは問題なく実行できます。問題は基本的に、HTTPではなくTCPを使用するようにWebサイトを設計できるかどうかということです。
レイノス

同じ制限が適用され、エフェメラルポート/メモリが不足しても、同時にサービスを提供できる人数が制限され、システムに不要な負担がかかります。
zeekay

はい、制限はありますが、接続ごとに新しいスレッドを作成しなければ、それほど大きな問題ではないと思います。
レイノス

私はすべてのユーザー用のソケットをすでに持っています。グローバルチャット+ニュースフィード。
ハリー

1
2011年には、これは素晴らしい答えだったと思います。-それで、あなたがどこから来たのか分かります。しかし、2019年にはWebSocketが成熟しました。
bvdb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.