Ruby on rails Rails ActionCable和Ember CLI应用程序-资源瓶颈

Ruby on rails Rails ActionCable和Ember CLI应用程序-资源瓶颈,ruby-on-rails,ember.js,actioncable,Ruby On Rails,Ember.js,Actioncable,我们已经成功地在应用程序中使用Rails中的ActionCable实现了实时更新,并在Ember CLI中将消费者作为客户端服务实现,但我正在寻找一种更好、更便宜的方法 app/models/myobj.rb app/models/child_obj.rb 前端/app/services/stream.js 这里我们从广播中获取模型和id数据,并使用它从服务器重新加载 import Ember from 'ember'; export default Ember.Service.extend(

我们已经成功地在应用程序中使用Rails中的ActionCable实现了实时更新,并在Ember CLI中将消费者作为客户端服务实现,但我正在寻找一种更好、更便宜的方法

app/models/myobj.rb

app/models/child_obj.rb

前端/app/services/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端句柄设置适当的模型属性。这是正确的方法,还是有人推荐其他方法?

您可以通过套接字发送整个实体有效负载以及更改事件。稍后,您可以将有效负载推送到存储—创建新记录或更新现有记录。这样可以避免额外的服务器请求

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
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});
        }
      }
    );
  },

});