我有websocket价格数据流入我的rails api应用程序,我希望不断更新,以便任何api请求获得更新的响应。将每个更新保存到数据库太昂贵了。我怎样才能做到这一点?在Ember我可以修改模型并且它仍然存在。它似乎不会发生在rails中。
频道控制器:
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
我是否以正确的方式解决这个问题?每次我想要更新时使用find似乎效率低,这可能是每秒多次。在Ember我创建了一个记录Id查找数组,因此我可以快速匹配market_name,我不知道如何在rails中执行此操作。
答案 0 :(得分:0)
对某些商店的持久性是让其他线程以最新值响应的唯一方法。
而不是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"])
使用适当的索引,每次更新可能会有一个sub-ms性能。
根据您的业务需求:
如果你每秒都在为一个市场获得大量的更新(使所有先前的陈旧和无用),你可以选择忽略一些,而不是点火更新。