保持Rails数据从Websocket更新而不保存到数据库

时间:2017-10-27 00:56:43

标签: ruby-on-rails websocket actioncable

我有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中执行此操作。

1 个答案:

答案 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性能。

根据您的业务需求:

如果你每秒都在为一个市场获得大量的更新(使所有先前的陈旧和无用),你可以选择忽略一些,而不是点火更新。