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

Rails ActionCable and Ember CLI app - Resource Bottlenecks

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

app/models/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

app/models/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

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

});

这种方法 "works" 但感觉很幼稚并且占用大量资源,每次更新都会再次访问我们的服务器,这需要重新验证请求、从数据库中获取数据、重新序列化对象(这可能有额外的数据库拉),并通过网络发送它。如果请求数量很高,这实际上会导致池和限制问题。

我认为我们可以在 Rails 广播中发送模型、ID 和变更集 (self.changes),并让 Ember 侧句柄设置适当的模型特性。这是正确的方法,还是有人推荐其他方法?

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