使用Heroku构build可扩展分析后端的最佳方法是什么?

我需要构build一个简单的分析后端来捕获用户行为。 这将通过网页上的Javascript代码段捕获,就像Google Analytics或Mixpanel数据一样。

系统需要捕捉接近实时的浏览器数据(页面滚动位置,鼠标位置等),每隔5秒logging一次用户页面的状态。 每次测量只有三个属性,但必须经常进行。

数据不一定需要每5秒发送一次,但可能会频繁出现,但是当用户在页面上时,我必须获取所有数据。 也就是说,我不能每分钟上一次,而在119秒后离开的人丢失最后59秒的数据。

如果可能的话,我想build立一个系统,在可预见的未来可扩展,这意味着它为10,000个站点工作,每个站点有100个并发访问者,即每10万个并发用户每5秒发送一个事件。

我不担心查询数据,可以使用单独的系统来完成。 我最关心如何处理数据本身的捕获。

要求

根据上面的预算,系统需要处理来自100,000个用户池的每秒20,000个事件。

我想在Heroku上托pipe这个服务,但是在使用Rails做了很多工作的时候,我对高吞吐量系统是完全陌生的(除了知道你不使用Rails来处理它们)。

问题

  1. 有没有一个商业系统可以做到这一点(像Pusher,但数据采集以及分配)?
  2. 我应该使用HTTP请求还是使用websockets?
  3. node.js是正确的select吗?
  4. 如果我select一个基于套接字的解决scheme,那么每个networking服务器上Heroku上的testing套件可以处理多less个套接字
  5. 在Mongo / Reddis等之间进行存储的select有什么相关的考虑
  6. 这种问题实际上需要两个解决scheme – 第一个让您快速而低成本地达到合理的规模,第二个以更低的增量成本超越这个规模,但需要更多的开发工作?

我的高层对你的评论是build立你的系统遵循12因子devise,然后担心客户到达时扩展。 我对Node.js和npm生态系统感到兴奋,但我也认为你可以用Rails构build一个完全可以接受的平台。 如果用3个dynos来支持100K的并发用户,而用Rails来支持100个并发用户,那么如果你对Ruby的安慰让你的上市时间增加了3个月,你还是可以用Rails更好。 无论如何,假设你去了Node,这里是我的答案:

  1. 这里有一些Pusher的替代品 ,可能适合你和Pusher vs. Pubnub的讨论。 另见Ably 。
  2. 使用socket.io 。 这在很大程度上是标准的,因为它使用最好的传输,并从WebSocket到HTTP方法。
  3. 节点是一个很好的select,也是新潮(见模块增长率 )。 我怀疑你可以使你的系统在Node,Rails或其他几个框架中正常工作。
  4. Heroku dyno应该能够支持数万个并发连接,具体取决于你使用RAM的效率。 具有16 GB RAM的服务器能够支持100万个并发连接。 假设你是内存有限的,带有512 MB RAM的Heroku dyno应该能够支持〜30 K的连接。
  5. 您可能希望select两个不同的系统,一个用于存储和处理数据,另一个用于caching。 这里有一篇关于从Instagram创build者那里select核心数据平台的好文章 。 对于核心数据,我推荐使用Sequelize ORM的Postgres(在Heroku上)。 但是,Mongo用SOLRsearch也可能工作得很好。 请注意,如果这是您想要的方式,Postgres 9.2可以用作NoSQL数据存储。 对于caching系统,我强烈build议Redis。
  6. 不,我会尽量避免丢弃工程。 相反,build立一些可行的方法,并期望每次达到一个数量级以上的stream量时,系统的某个部分就会中断,需要更换。 但是,如果遵循12因子原则,在投资替代品时,您应该保持良好的水平扩张。

祝你好运。

  1. 有许多套接字服务,但Pusher和Pubnub似乎是这个领域的市场领导者。 无论你做什么,都不要像socket.io那样自己托pipe,因为Heroku超时请求超过30秒,包括websocket。 所以一个托pipe套接字肯定是不可能的,除非你计划每隔几秒closures和重新打开套接字。
  2. 如果您要使用像Pusher这样的套接字服务,那么您将需要为服务实现一个http端点,以便将数据发送给您。 所以我只是把中间人剪掉,然后直接去http请求。 当然,您需要收集持续的用户交互,但是这些都可以logging在JavaScript客户端上,并通过CORS XHR或跟踪图像定期发送回应用。
  3. 节点是一个不错的select,它很轻松,设置起来非常简单,而且可用的npm库将包含启动所需的一切。 Rails也可以非常迅速,特别是如果你删除了你不需要的东西。 在这个问题上有一个伟大的railscast 。 重要的是尽可能保持简单。 也许把它分成两个应用程序; 一个用于收集数据,另一个用于分析/处理数据。 这样你就可以收集节点中的数据,因为它很快,并在rails中分析/处理,因此很容易。
  4. 正如我在1中提到的那样,只是不会在heroku中工作,即使你使用推送器,你仍然将不得不支持相同数量的http请求,因为当推送器接收到数据时,它将直接发送给你。 至于你会需要多less个dynos,这将是一个很容易testing的东西,但不是我能估计的东西。 这将完全取决于收集数据的代码的效率。 一个简单的Apache ABtesting具有您所期望的负载和并发性,可以让您很好地指出您将需要什么。 节点自带的并发性,但如果你要使用Rails来收集数据,然后使用独angular兽或美洲狮作为您的服务器,因为它们支持并发。 Apache ABtesting时也可以尝试不同的configuration; heroku现在提供了两个dynos,这是1024mb而不是512,这将允许你更多的并发性
  5. 这个stackoverflow线程build议redis更快,更快是你想要收集数据。 虽然在收集之后,您可能会想要处理它,并将其存储在多个关键的价值存储区中。 Mongo是一个很好的select,但我会去像neo4j这样的graphics数据库,因为错综复杂的连接分析。
  6. 如果你在这里进入新的领域,那么你不会第一次做对,你会发现自己在迭代它以获得最好的性能和最准确的数据。 最终,你可能会删除它,并重新开始一个新的架构,循环将继续。 保持数据收集和分析分离意味着您可以专注于分别获得每一点。

我想提及的一些附加点是使用CDN来分发JavaScript客户端,或者更好的是提供从页面提供的完整JS。 无论哪种方式,加载速度和asynchronous加载。 这听起来像一个有趣的项目。 祝你好运!

编辑在另一个宇宙,你不必使用heroku,websockets将是一个很棒的解决scheme。