2017-07-25 28 views
0

我們在應用程序中使用ActionCable在Rails中成功實現了實時更新,並在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}); 
     } 
     } 
    ); 
    }, 

}); 

這種做法「作品」,但感覺天真又是資源密集型,再次擊中我們的服務器的每次更新,這需要重新認證的要求,從數據庫中抓取數據,重新序列化對象(這可能有額外的數據庫拉),並通過電線發送。如果請求數量很高,這實際上會導致池和節流問題。

我在想我們可能會在Rails廣播中發送模型,id和變更集(self.changes),並讓Ember側邊的句柄設置合適的模型屬性。這是正確的方法,還是有別人推薦的東西?

回答

1

你應該沒問題,通過套接字發送整個實體有效載荷和你的改變事件。稍後,您可以將有效負載推送到商店 - 創建新記錄或更新現有的記錄。這樣你就可以避免額外的服務器請求。