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 侧句柄设置适当的模型特性。这是正确的方法,还是有人推荐其他方法?
您应该可以通过套接字发送带有更改事件的整个实体负载。稍后您可以将有效负载推送到商店 - 创建新记录或更新现有记录。这样您就可以避免额外的服务器请求。
我们已经在 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 侧句柄设置适当的模型特性。这是正确的方法,还是有人推荐其他方法?
您应该可以通过套接字发送带有更改事件的整个实体负载。稍后您可以将有效负载推送到商店 - 创建新记录或更新现有记录。这样您就可以避免额外的服务器请求。