【问题标题】:Rails ActionCable and Ember CLI app - Resource BottlenecksRails ActionCable 和 Ember CLI 应用程序 - 资源瓶颈
【发布时间】:2017-07-25 15:37:07
【问题描述】:

我们已经在 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

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

【问题讨论】:

    标签: ruby-on-rails ember.js actioncable


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多