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

Pet*_*xey 10 heroku websocket node.js

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

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

数据不一定需要每5秒发送一次,它可以不那么频繁地加速,但是当用户在页面上时,我必须获得所有数据.即我不能每分钟一次公共汽车,并在119秒后离开的人丢失最后59秒的数据.

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

我并不担心查询数据,可以使用单独的系统来完成.我最感兴趣的是如何处理数据本身的捕获.

要求

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

我想在Heroku上托管这项服务,但是当我用Rails做了很多工作时,我对高吞吐量系统完全不熟悉(除了知道你不使用Rails处理它们).

问题

  1. 有没有一个商业系统可以做到这一点(如Pusher,但数据捕获和分发)?
  2. 我应该使用HTTP请求还是websockets来做这件事?
  3. node.js是正确的选择还是时尚?
  4. 如果我选择基于套接字的解决方案,Heroku上的dyno可以为每个网络服务器处理多少个套接字
  5. 在Mongo/Reddis等之间进行选择以进行存储有哪些相关的考虑因素
  6. 这是一种实际需要两种解决方案的问题 - 第一种是让您快速,低成本地达到合理规模,第二种是以较低的增量成本超越这种规模,但需要提前进行更多的开发工作?

Dan*_*ohn 8

我对您的高级评论是按照12因素设计构建您的系统,然后担心随着客户的到来进行扩展.我对Node.js和npm生态系统感到非常兴奋,但我也认为你可以用Rails构建一个完全可以接受的平台.如果使用3个dynos来支持100个并发用户并使用Rails加倍,那么使用Rails可能会更好,如果你对Ruby的安慰让你上市3个月更快.无论如何,假设你使用Node,这里是我的答案:

  1. 以下是Pusher的一些替代方案,可能对您有用,并讨论Pusher vs. Pubnub.另见Ably.
  2. 使用socket.io.它主要是标准,因为它使用可用的最佳传输,并从WebSockets回退到HTTP方法.
  3. Node是一个很棒的选择,也很新潮(参见模块增长率).我怀疑你可以让你的系统在Node,Rails或其他几个框架中正常工作.
  4. Heroku dyno应该能够支持数以万计的并发连接,具体取决于你使用RAM的效率.具有16 GB RAM的服务器能够支持一百万个并发连接.假设您受RAM限制,具有512 MB RAM的Heroku dyno应该能够支持~30 K连接.
  5. 您可能希望选择两个不同的系统,一个用于存储和处理数据,另一个用于缓存.这是一篇关于从Instagram的创建者那里挑选核心数据平台的精彩帖子.对于核心数据,我推荐使用Sequelize ORM的Postgres(在Heroku上).但是,使用SOLR进行搜索的Mongo可能也可以正常工作.请注意,Postgres 9.2可以用作NoSQL数据存储区,如果这是您想要的方式.对于缓存系统,我强烈推荐Redis.
  6. 不,我会尽量避免扔掉工程.相反,构建一些有效的东西,并期望每当你达到一个数量级的更多流量时,系统的某些部分将会中断并需要被替换.但是,如果你遵循12因素原则,那么在投资替换时你应该处于良好状态以横向扩展.

祝好运.