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侧边的句柄设置合适的模型属性。这是正确的方法,还是有别人推荐的东西?