Ruby on rails Rails应用程序分为两层(数据接收/数据读取)

Ruby on rails Rails应用程序分为两层(数据接收/数据读取),ruby-on-rails,activerecord,scalability,Ruby On Rails,Activerecord,Scalability,我有一个具有两个不同层的应用程序: 第一层:接收大量数据的ruby tcp服务器 这是一个运行EvenMachine的非常轻的应用程序,它只接收数据,对它们进行一些计算,然后通过http将它们发送到第二层 第二层:提供用户数据可视化的rails应用程序 我使用thin作为应用服务器 该层接收来自第一层的信息并将其存储在数据库中。该层是用户前端。这里定义了模型和迁移 我没有合并这两个层,因为我需要一个tcp(不是http服务器)作为入口点。 我想知道什么是最有效和可扩展的方法: 一旦格式化正

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

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

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

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

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

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

  • 重写node.js上的第一层,并使用node postgres确保无阻塞IO

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

  • 我认为有一个基于事件机的非阻塞mysql gem,尽管我不确定它是否仍然被维护
  • 第一层的“计算”如何?会很慢吗?由于存在GIL,单个MRI进程不能使用多核,因此您可能需要在第一层中使用多个进程,并在其前面使用负载平衡器
  • 与第一层进行计算和第二层将数据存储到数据库中不同,可能还有另一种方法:第一层接收数据,将其作为“作业”存储在redis中。另一个工作进程获取“作业”,进行计算并将其存储到数据库中,这就是Resque的工作方式。所以第二层只做普通的http事情。但是,您仍然在谈论“大量数据”,因此将其存储到redis可能也需要一些时间,但关键是将一些繁重的工作转移到后台进程,以便第一层或第二层可以继续处理其他请求
  • 我编写了一些代码来比较node.js和event machine(主要关注CPU的使用情况),其实差别不大
    2/第一层的计算非常有限(主要是文本解析)。我计划添加一个负载平衡器。3/我需要实时将数据添加到数据库中。在数据库中保存收到的每个新数据时,即使使用附加作业保存,我是否也会遇到阻塞IO的风险?4/由于节点postgres是非阻塞IO,我认为这可能是一个不错的选择。你们怎么想?若接收和存储数据基本上是最重要的,那个么为什么要接收数据并将其传输到第二层和第二层“传输”到数据库呢?为什么第一层不接收它&让其他线程完成其余的工作?至少它节省了一次传输。这就是我想知道的事实:)我的第一个猜测是让第一层使用ActiveRecord将数据保存到数据库,但是如果同时收到100多个数据,ActiveRecord/Postgres会添加一些阻塞IO吗?这就是为什么你需要其他线程来完成存储工作:)至于node.js,我看不出事件机有什么不同,它也有单核问题。使用事件机,如果您愿意,可以随时使用jruby。