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

标签 node.js heroku websocket

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。




Improve this question




我需要构建一个简单的分析后端来捕获用户行为。这将通过网页上的 Javascript 片段捕获,就像 Google Analytics 或 Mixpanel 数据一样。
系统需要捕捉接近实时的浏览器数据(页面滚动位置、鼠标位置等),每5秒记录一次用户页面的状态。每次测量只有三个属性,但必须经常测量。
数据不一定需要每 5 秒发送一次,它可以不那么频繁地使用,但是当用户在页面上时我必须获取所有数据。即我不能每分钟总线一次并丢失最后 59 秒的数据对于在 119 秒后离开的人。
如果可能的话,我想构建一个可以在可预见的 future 扩展的系统,这意味着它适用于 10,000 个站点,每个站点有 100 个并发访问者,即 100,000 个并发用户,每个用户每 5 秒发送一个事件。
我不担心查询数据,这可以使用单独的系统来完成。我最感兴趣的是如何处理数据本身的捕获。
要求
根据上述预算,系统需要每秒处理来自 100,000 个用户池的 20,000 个事件。
我想在 Heroku 上托管这个服务,但是虽然我已经用 Rails 做了很多工作,但我对高吞吐量系统完全陌生(除了知道你不使用 Rails 处理它们)。
问题

  • 是否有适合这样做的商业系统(例如 Pusher,但用于数据捕获和分发)?
  • 我应该使用 HTTP 请求还是 websockets 来做到这一点?
  • node.js 是这个的正确选择还是只是时尚?
  • 如果我选择基于套接字的解决方案,Heroku 上的 dyno 可以为每个网络服务器处理多少个套接字
  • 选择 Mongo/Reddis 等进行存储有哪些相关注意事项
  • 这种类型的问题是否实际上需要两种解决方案——第一种是让您快速且廉价地实现合理的规模化,第二种是让您以较低的增量成本超越规模,但需要更多的前期开发工作?
  • 最佳答案

    我对您的高级评论是按照 12 factor 构建您的系统。设计,然后担心随着客户的到来而扩展。我对 Node.js 和 npm 生态系统感到非常兴奋,但我也认为您可以使用 Rails 构建一个完全可以接受的平台。如果使用 Node 需要 3 dynos 来支持 100 K 并发用户,而使用 Rails 需要两倍,那么使用 Rails 可能会更好,如果您对 Ruby 感到满意,可以让您更快地进入市场 3 个月。无论如何,假设您使用 Node,以下是我的答案:

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

  • 祝你好运。

    关于node.js - 使用 Heroku 构建可扩展分析后端的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253618/

    相关文章:

    node.js - Socket.io 连接恢复轮询,从不触发 'connection' 处理程序

    javascript - 如何使用 jquery/ajax 访问响应头

    node.js - 通过 websockets 发送 RabbitMQ 消息

    javascript - WebSocket 'onopen()' 函数内的对象方法调用给出 'Function is undefined'

    mysql - sequelize 返回 blob 作为文本

    node.js - 我可以假设 `node` 总是在 NPM 设置的 $PATH 中吗?

    heroku - 捕获 TERM 并发送 QUIT 后,Heroku 上的 Unicorn 退出超时

    node.js - 将 Cloud9 IDE 部署到 Heroku?

    ruby-on-rails - Heroku 上的 Rails 在启动时崩溃

    c++ - 虚幻引擎 4 上的 Websockets?