2017-07-25 10 views
0

RailsのActionCableを使用してアプリをリアルタイムに実装し、Ember CLIのクライアントサービスとしてコンシューマを実装しましたが、より優れた安価なアプローチを探しています。Rails ActionCableとEmber CLIアプリケーション - リソースのボトルネック

アプリ/モデル/ myobj.rb

has_many :child_objs 

def after_commit 
    ActionCable.server.broadcast("obj_#{self.id}", model: "myobj", id: self.id) 

    self.child_objs.update_all foo: bar 
end 

アプリ/モデル/ child_obj.rb

belongs_to :myobj 

def change_job 
    self.job = 'foo' 
    self.save 
    ActionCable.server.broadcast("obj_#{self.myobj.id}", model: "child_obj", id: self.id) 
end 

フロントエンド/アプリ/サービス/ stream.js ここでは、モデルとIDのデータをブロードキャストから取り出し、それを使ってサーバーからリロードします。

import Ember from 'ember'; 

export default Ember.Service.extend({ 

    store: Ember.inject.service(), 

    subscribe(visitId) { 
    let store = this.get("store") 
    MyActionCable.cable.subscriptions.create(
     {channel: "ObjChannel", id: objId}, { 
     received(data) { 
      store.findRecord(data.model, data.id, {reload: true}); 
     } 
     } 
    ); 
    }, 

}); 

このアプローチは、「作品」が、データベースからデータをつかん、再認証要求を必要とする各アップデートのために再び私たちのサーバーを打つ、ナイーブな感じや資源集約的である、オブジェクトを再直列化(その可能性追加のデータベースプルを持つ)、ワイヤを介して送信します。これは、要求の数が多い場合、実際にはプールとスロットルの問題を引き起こします。

モデル、ID、チェンジセット(self.changes)をRailsブロードキャストに送信し、Emberサイドハンドルで適切なモデルプロパティを設定できると考えています。これは正しいアプローチですか、それとも他に誰かが推薦するものがありますか?

答えて

1

変更イベントを使用して、エンティティペイロード全体をソケット経由で送信しても問題ありません。後でペイロードをストアにプッシュすることができます。新しいレコードを作成したり、既存のレコードを更新したりすることができます。これにより、追加のサーバー要求を回避できます。

関連する問題