在Mac App和Web之间同步获得大量小数据的最佳方法是什么?

时间:2012-02-26 02:28:40

标签: objective-c ruby-on-rails json mongodb mapreduce

我正在考虑使用MongoDB。正是这样,目标很清楚,这是需要发生的事情: 在我的应用程序中,Finch(finchformac.com了解详细信息)我每天都有成千上万的条目为每个用户打开了什么窗口,打开它的时间,关闭它的时间以及标签,如果他们选择了一个为了它。我需要在线备份这些数据,以便它可以同步到其他Mac计算机等。我还需要能够从他们的数据在线绘制图表,这意味着一些复杂的查询会出现数十万条记录。

现在我尝试使用Ruby / Rails / Mongoid在应用程序端使用JSON解析器,一次以10,000个记录的增量发送数据,使用后台mapreduce作业将数据处理到其他集合。但是,这一切似乎都阻止了,最终太慢了。 (如果有的话)有什么建议可以解决这个问题?

1 个答案:

答案 0 :(得分:1)

您遇到了一个复杂的问题,这意味着您需要将其分解为更小,更容易解决的问题。

问题(我认为):

  1. 你有一个收集数据的应用程序。你只需要 将数据存储在本地某处,直到它同步到 服务器
  2. 您已收到服务器上的数据,现在需要推送它 进入数据库的速度足够快,以免速度变慢。
  3. 你必须报告这些数据,这听起来很复杂。
  4. 为了简单起见,您可能希望将其编写为某种API(并且由于您在客户端上有大量的备用处理周期),您需要将客户端处理的这些数据块准备好用于JSON。导入数据库。一旦你有了JSON,你就不需要Mongoid(你只需要将JSON直接扔进数据库)。你也可能不需要rails,因为你只是创建一个简单的API,所以坚持使用Rack或Sinatra(可能使用像Grape这样的东西)。

    现在你需要解决整个“这一切似乎阻止并且最终太慢”的问题。我们已经删除了Mongoid(因此无需转换JSON - > Ruby Objects - > JSON)和Rails。在我们开始对这些数据进行MapReduce之前,您需要确保它足够快地加载到数据库中。您可能需要构建整个事物,以便MapReduce支持您的报告功能。对于数据的同步,除了传递JSON之外,您不需要做任何事情。如果您的数据没有足够快地写入数据库,则应考虑Sharding your dataset。这可能是使用一些基于用户的密钥完成的,但您比我更了解您的数据模式。您需要选择分片密钥,这样当多个用户同时进行同步时,他们可能会使用不同的服务器。

    解决问题1和2后,您需要处理报告。 Mongo中的MapReduce函数可能支持这一点。我对这部分的第一个评论是确保你至少运行Mongo 2.0。 In that release 10gen sped up MapReduce(我的测试表明它比1.8快得多)。除此之外,您可以通过Sharding并将读取定向到副本集中的辅助服务器(您正在使用副本集?)来实现进一步增加。如果仍然无效,请考虑构建模式以支持您的报告功能。这使您可以在客户端上使用更多周期来执行工作,而不是加载服务器。但是,在您证明传统方法不起作用之后,应该保留这种优化。

    我希望文字墙有所帮助。祝你好运!