我有websocket价格数据流入我的rails api应用程序,我想保持更新,以便任何api请求都能得到更新的响应。将每个更新保存到数据库的成本太高。我该怎么做?在 Ember 中,我可以修改模型并保留下来。这似乎不会发生在轨道上。
通道控制器:
def receive(message)
#ActionCable.server.broadcast('channel', message)
platform = Platform.find(params[:id]);
market = platform.markets.find_by market_name: message["market_name"]
market.attributes = {
market.price = message.values["price"],
etc......
}
#market.save [this is too expensive every time]
end
我这样做的方式是否正确?每次我想更新时使用查找似乎效率低下,每秒可能多次。在 Ember 中,我创建了一个记录 Id 查找数组,以便我可以快速匹配market_name,我不知道如何在 rails 中做到这一点。
持久性到某个存储是让其他线程使用最新值响应的唯一方法。
而不是 3 个查询(2 select
s 和 1 update
),您只需 1 个update
即可完成
Market.where(platform_id: params[:id], market_name: message["market_name"]).
update_all(price: message.values["price"])
使用适当的索引,每次更新可能会具有子毫秒的性能。
根据您的业务需求:
如果您每秒都会获得大量市场更新(使所有先前的更新过时且无用),您可以选择忽略很少的更新,根本不触发更新。