8

というコレクションを持つバックボーン アプリケーションがありますLinksLinksの REST API URI にマップされます/api/links

API は、ユーザーに最新のリンクを提供します。ただし、ユーザーがこの API をヒットしたときにメッセージ キューにジョブを追加し、データベース内のリンクを更新するように要求するシステムを用意しています。

この作業が完了したら、新しいリンクを Backbone コレクションにプッシュします。

どうすればいいですか?私の考えでは、次の 2 つのオプションがあります。

  • バックボーン コレクションから、API をロング ポーリングして新しいリンクを探します
  • ジョブが完了したときにコレクションに「メッセージ」を送信するように WebSockets をセットアップし、新しいデータを一緒に送信します。
  • アプリケーションの REST API を破棄し、すべてに WebSocket を使用するだけです。後でリアルタイムのニーズが増える可能性があるためです。

REST API を使用した WebSocket

WebSocket を使用する場合、これをバックボーン コレクションに統合して REST API と連携させる最善の方法がわかりません。

現時点で、私のバックボーン コレクションは次のようになっています。

var Links = Backbone.Collection.extend({
  url: '/api/links'
});

Backbone コレクションで AJAXとWebSocketを処理できるようにする方法がわかりません。CRUD Ajax 操作にデフォルトの Backbone.sync を引き続き使用し、単一の WebSocket 接続を手動で処理する必要がありますか? 私の考えでは:

var Links = Backbone.Collection.extend({
  url: '/api/links',
  initialize: function () {
    var socket = io.connect('http://localhost');
    socket.on('newLinks', addLinks)
  },
  addLinks: function (data) {
    // Prepend `data` to the collection
  };
})

質問

上記のオプションまたはその他のアイデアから、リアルタイムのニーズをどのように実装すればよいですか? コンテキストを示すためにコードの例を提供してください。

4

2 に答える 2

0

私の会社には、バックボーンを使用した完全な Socket.io ベースのソリューションがあります。これは主に、別のユーザーの画面で変更がリアルタイムで行われたときにアプリで GUI を「更新」するためです。

一言で言えば、ワームの缶詰です。Socket.IO はうまく機能しますが、背後にあるものを見ることに興味がないかもしれない多くのドアも開きます。バックボーン イベントは ajax トランザクションに非常に密接に結び付けられているため、非常にうまくいきません。そのデフォルトの動作を効果的にオーバーライドしています。たとえば、ソケットの応答は変更されたモデルではなく、コレクション全体であるためです。私たちのソリューションは、ほとんどのソリューションよりも少し進んでいます。トランザクションは、現在および将来、通信できるようにする必要がある多くのデバイス間でユニバーサルになるように特別に設定された DDL を介して行われるからです。

ioBind パスを使用する場合は、ソケット以外のトラフィックと比較して、変更イベントに異なる方法を使用することに注意してください (混合して一致させる場合)。これがその方法の大きな欠点です。「変更」などの標準的なものは「たとえば、衝突を避けるために更新します。深夜のデバッグ中や、新しい開発者がチームに参加したときは、非常に混乱する可能性があります。そのため、私は組み合わせではなく、ソケットを使用するかしないかのどちらかを好みます。ソケットはこれまでのところ良好で、恐ろしく高速です。

面倒な作業を行うベース関数を使用し、このベースを拡張して必要なトランザクション機能を提供する他のいくつかの関数を使用します。

この記事は、私たちが使用した方法の優れたスターターを提供します。

于 2015-03-17T20:11:06.830 に答える