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側邊的句柄設置合適的模型屬性。這是正確的方法,還是有別人推薦的東西?