1

我有一个具有 2 个不同层的应用程序:

  • 第一层:ruby tcp 服务器接收大量数据
    这是一个运行 EvenMachine 的非常轻量级的应用程序,它只接收数据,对它们进行一些计算,然后通过 http 将它们发送到第二层

  • 第二层:提供用户数据可视化的rails应用程序
    我使用thin作为应用程序服务器这一层从第一层接收信息并将它们存储在数据库中。该层是用户前端。模型和迁移在此处定义。

我没有合并 2 层,因为我需要一个 tcp(不是 http 服务器)作为入口点。
我想知道什么是最有效和可扩展的方法:

  • 一旦格式正确,通过http将数据从第一层发送到第二层

  • 使用ActiveRecord或pg gem直接将数据放在第一层的数据库中。每次 EventMachine 收到一个请求,它都会将它传递给 ActiveRecord,它只需要在数据库中写入一条记录。如果收到大量请求,是否存在阻塞 IO 的风险?

  • 在 node.js 上重写第一层并使用 node-postgres 来确保非阻塞 IO。

确保可扩展性和非阻塞 IO 的最佳方法是什么?

4

1 回答 1

0
  1. 我认为有一个基于事件机的非阻塞 mysql gem,但我不确定它是否仍然被维护。
  2. 第一层的“计算”呢?会不会很慢?由于 GIL 的存在,单个 MRI 进程无法利用多核,因此您可能需要在第一层中使用多个进程并在其前面使用负载均衡器。
  3. 不是让第一层进行计算,第二层将某些东西存储到数据库中,而是可能有另一种方法:第一层接收数据,将其作为“作业”存储在 redis 中。另一个工作进程获取“作业”,进行计算并将其存储到数据库中,这就是 Resque 的工作方式。所以第二层只做正常的http事情。但是,您仍然在谈论“大量数据”,因此将其存储到 redis 中可能也需要一些时间,但关键是将一些繁重的工作转移到后台进程,以便第一层或第二层可以继续处理其他要求。
  4. 我写了一些代码来比较 node.js 和 event-machine(主要关注 CPU 使用率),并没有太大的区别。
于 2013-05-16T15:02:34.630 回答