web-dev-qa-db-ja.com

置き換えるWebsocket API REST API?

主な機能がリアルタイムで動作するアプリケーションがあります。これは、Webソケットまたはロングポーリングを介して実行されます。

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

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

93
Harry

ここの他の答えにはメリットがないと言わないでください、彼らはいくつかの良い点を作ります。しかし、私は一般的なコンセンサスに反し、リアルタイム機能以上のウェブソケットへの移行は非常に魅力的であることに同意します。

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

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

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

このタイプのソリューションの調査の進捗状況を確認したいと思います。 githubの実験がある場合は、それらを指摘してください。私はまだ持っていませんが、すぐに期待しています。

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


ExpressでSocket.IOを使用するための優れたチュートリアル。エクスプレスセッションをsocket.ioに公開し、認証済みユーザーごとに異なるルームを作成する方法について説明します。

Node.js/socket.io/backbone.js/express/connect/jade/redisのチュートリアル(認証、Joyentホスティングなど):

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

クライアント上のbackbone.jsを使用してアプリケーションを構築し、サーバー上のexpress、socket.io、dnodeを使用してnode.jsを作成します。

DboneでBackboneを使用する:

89
Tauren

HTTP RESTとWebSocketは非常に異なります。HTTPはstatelessなので、Webサーバーは何も知る必要はありません。 、Webブラウザとプロキシでキャッシュを取得します。WebSocketを使用する場合、サーバーはstatefulになり、サーバーへの接続が必要になりますサーバー上のクライアント。

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

Push サーバーからクライアントへのデータが必要な場合にのみWebSocketを使用し、その通信パターンはHTTP(回避策のみ)。プッシュは、他のクライアントが作成したイベントを他の接続されたクライアントが利用できるようにする必要がある場合に役立ちます。ユーザーが他のクライアントの行動に基づいて行動する必要があるゲーム。または、あなたのウェブサイトが何かを監視している場合、サーバーが常にクライアントにデータをプッシュします。株式市場(ライブ)。

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

52
Jonas

私はすべてのサイト機能のWebSocket APIへの移行を考えています

いいえ、できません。両方のモデルをサポートしていれば害はありません。 [〜#〜] rest [〜#〜]を片方向通信/単純なリクエストに使用&WebSocket特に双方向サーバーでリアルタイム通知を送信する場合。

WebSocketRESTful HTTPよりも効率的なプロトコルですが、それでもRESTful HTTP以下の領域でWebSocketを介したスコア。

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

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

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

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

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

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

詳細については、こちらをご覧ください 記事 .

36
Ravindra babu

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

したがって、他の人の間違いから学ぶことはできず、開発は遅くなるでしょう。また、「試行錯誤」された戦略でもありません。

もちろん、HTTPのすべての利点を失うことにもなります(ステートレスであり、キャッシュが大きな利点です)。

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

また、SEOと検索エンジンがWebソケットを実行しないことを忘れないでください。だから、あなたはSEOについて忘れることができます。

個人的には、あまりにも多くのリスクがあるため、これに対してはお勧めします。

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

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

10
Raynos

私は少しのレッスンを学びました(難しい方法)。 Ubuntu AWS EC2クラウドサービス(強力なGPUを使用)で実行する多くの処理アプリケーションを作成し、その進行状況をリアルタイムで確認するためだけにフロントエンドを作成したいと考えました。 リアルタイムデータが必要であるという事実により、更新をプッシュするためにwebsocketが必要であることは明らかでした。

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

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

そうは言っても、正直に言うとsocket-ioの優れた機能を逃しました Socket-ioにはもっとたくさんの機能があります。初期設計では、それをさらに活用できます。対照的に、古いwebsocketをsocket-ioのwebsocket機能に置き換えただけでした。 (部屋もチャンネルもありません...)再設計すれば、すべてがより強力になります。しかし、その時間はありませんでした。それは次のプロジェクトで覚えておくべきことです。

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

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

そうは言っても、来週はライブになります。私たちは時間内に到着しました、すべてが動作します。 そしてそれは高速ですが、スケーリングしますか?

3
bvdb

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

仕事の分離は次のようになります。

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

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

  3. HTMLおよびJavascript。これらはwebappのUIを構成します。これらは、一般にCDNに配置されると有益です。

  4. [〜#〜] wsdl [〜#〜]を使用するWebサービスは、enterprise levelメッセージとデータの受け渡しのための明確に定義された標準を提供する企業間通信。主に、これをDatapowerデバイスにオフロードして、Webサービスハンドラーにプロキシします。

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

ただし、モバイルアプリケーションの場合、websocketは切断されたセッションに再接続できません( 接続を閉じた後にwebsocketに再接続する方法 )。それを管理するのは簡単ではありません。だから、モバイルアプリの場合、私はまだ推奨REST APIおよびポーリング。

WebSocket vs REST)を使用する場合の注意点は、scalabilityです。WebSocketセッションは引き続きサーバーによって管理されます。適切に行われたRESTful APIはステートレス(管理する必要のあるサーバー状態がないことを意味します)であるため、スケーラビリティは垂直方向

3

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

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

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

  • スケーラビリティ:WebSocketには、オープンな接続と、Webスケールに合わせたさまざまなOpsセットアップが必要です。
  • Learnin:Learninに無制限の時間はありません。物事を成し遂げなければなりません!

私はまだプロジェクトでSocket.ioを使用しますが、RESTがうまくいく基本的なWebフォームには使用しません。

2
Michael Cole

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

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

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

1
yojimbo87