2017-07-25 66 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

你应该没问题,通过套接字发送整个实体有效载荷和你的改变事件。稍后,您可以将有效负载推送到商店 - 创建新记录或更新现有的记录。这样你就可以避免额外的服务器请求。