什么是用于渲染时间序列数据的优选方法

时间:2014-03-04 18:34:03

标签: mysql ruby-on-rails node.js redis time-series

我们有一个简单的JSON Feed,可以在某个时间点提供股票/价格信息。

e.g。

{t0, {MSFT, 20}, {AAPL, 30}}
{t1, {MSFT, 10}, {AAPL, 40}}
{t2, {MSFT, 5}, {AAPL, 50}}
  1. 存储/检索此数据以及根据此数据(例如MSFT)绘制图表的首选机制是什么。我应该使用redis还是mysql?
  2. 我还希望在收到新数据时向门户网站中的所有用户显示最新条目。可以每分钟检索一次数据。我应该将node.js用于此
  3. 我们是一个rails应用程序,想知道我应该使用哪些库/数据库来建模这个功能。

5 个答案:

答案 0 :(得分:3)

  1. 取决于流量和数据。如果数据是关系数据,意味着它是根据relational model正式描述和组织的,那么MySQL就更好了。如果大多数查询都是getset具有key->值,则意味着您将使用一个键获取数据,并且您需要支持许多客户端并且每分钟需要支持多个,然后挑衅地与Redis一起去。还有许多其他可能适用的noSQL DB,请查看this post以查看一些最受欢迎的版本。

  2. 有很多方法可以做到这一点..如果每分钟获得一次更新就足够了,客户端每分钟都会AJAX calls获取更新的数据,然后你可以使用php构建你的服务器端,.NET,java,servlet ot node.js,再次依赖于预期的用户并发性。 PHP很容易开发,而node.js可以支持许多短的i / o请求。您可能要考虑的另一个选项是使用服务器推送(例如节点socket.io)而不是客户端AJAX调用。通过这种方式,客户将在更新时立即得到通知。

  3. 就个人而言,我喜欢node.js和Redis,并使用了几个生产应用程序,支持使用单个服务器的许多并发用户。我喜欢节点,因为它易于开发,并且支持许多用户,Redis因为它具有惊人的速度和并发请求。话虽如此,我还使用MySQL来保存关系数据,并使用PHP服务器来快速开发API。每个都有自己的好处。

    希望您能发现此信息有用。

    KUF。

答案 1 :(得分:3)

正如Kuf所说,有很多方法可以解决这个问题,它确实取决于您的需求:低延迟,数据存储或易于实施。

如果你想要实现低延迟和简单的解决方案,Redis很可能是最好的解决方案。您可以使用Pub / Sub实时向客户端推送更新(例如Node的socket.io),并运行第二个Redis实例,将JSON数据作为排序集存储,并使用时间戳作为分数。我使用相同的方法来存储基于时间的统计数据。这种解决方案的缺点是,如果您想存储大量数据,那么资源(即内存)就很昂贵。

如果您希望以JSON格式存储大量数据并希望每分钟使用一次拉取来获取数据,那么使用ElasticSearch存储/检索数据是另一种可能性。您可以使用ElasticSearch的范围查询来使用时间戳字段进行搜索,例如:

"range": {
   "@timestamp": {
       "gte": date_from,
       "lte": now
   }
}

这增加了使用极其可扩展的冗余系统,存储大量数据和RESTful实时API的灵活性。

祝你好运!

答案 2 :(得分:2)

如果您有大量数据要像股票行情价格那样实时更新,解决方案应该包括服务器发布到客户端,而不是客户端不断地命中服务器进行更新。现在,发布/订阅(pub / sub)类型模型和websockets可能是一个不错的选择,具体取决于您的客户要求。

为了使用来自websockets的数据绘制数据,已经存在关于here的问题。

Ruby-toolbox有一个名为HTTP Pub Sub的类别,它可能是一个很好的起点。 MySQL或Redis是否更好取决于除了流媒体股票价格之外您将使用它做什么。 Redis可能是性能的更好选择。另请注意,websocket-rails假设Redis,如果您要使用它 - 仅作为示例。

在这种情况下,我不建议使用简单的JSON API(非pubsub),因为它也不会扩展(请参阅this answer),但如果你不认为你会这样做有很多客户,去吧。

答案 3 :(得分:2)

因为您基本上存储了JSON数据......

Postgres has a native JSON datatype

同样,MongoDB也可能适合作为JSON - > BSON

但是如果它只提供像memcached这样简单的数据就足够了。

答案 4 :(得分:1)

Cube可以作为参考的好例子。它使用MongoDB进行数据存储。

为了绘制时间序列数据,您可以尝试cubism.js

这两个项目均来自square