如何在"单个"上执行并行处理在服务器端使用rails API?

时间:2016-02-09 08:50:23

标签: ruby-on-rails api parallel-processing server

有很多方法可以处理"多个"服务器端的API请求。这里可以实现并行处理。 但我想知道如何平行处理单个API。 例如: 如果API请求执行方法say method1。

    def method 1  
      .....
      ......
      .......
    end

如果method1是一个很长的方法,可能需要很长时间来处理(包括多个循环和数据库查询),而不是按顺序处理它,那么是否有并行处理的余地?

一种方法是使用resque来创建后台作业。但是有没有其他方法可以做到这一点,如果是这样,应该如何编写代码来满足要求。

是否有任何服务器端方法来执行它不是特定于ruby的?

1 个答案:

答案 0 :(得分:1)

请注意,基于事件的服务器和后台作业之间存在巨大差异。

基于事件的服务器通常在单个线程上运行,并对非阻塞IO使用回调。最着名的例子是Node.js.对于ruby,有eventmachine库和各种框架以及简单的HTTP服务器。

例如,当第一个请求等待数据库调用时,事件服务器可以开始处理一个请求,然后切换到另一个请求。

请注意,即使您拥有基于事件的服务器,也无法在处理请求时遇到问题。用户体验将受到影响,客户端将断开连接。

如果后台作业(工作人员)进入,他们会让您的Web进程快速完成,以便它可以发送响应并开始处理下一个请求。发送电子邮件或清理过程等缓慢的流程不需要用户反馈或并发,这些都是工作人员。

总而言之 - 如果您的应用程序运行缓慢,那么使用并行处理并不能为您节省开支。它不是一颗银弹。相反,您应该投资优化数据库查询并利用缓存,以便快速响应。

虽然您可能在Rails中并行运行数据库查询或其他操作,但是增加的复杂性可能不值得获得性能提升。

我的意思是,你通常在Rails中所做的事情并不真正适用 - 你从数据库中取出一些内容并用它来制作JSON或HTML。在完成结果后才能真正开始渲染。虽然你可能会做一些事情,比如获取数据并使用它来同时渲染部分数据,但Rails不支持开箱即用,因为它会大大增加复杂性,同时不会给框架的大多数用户提供太多的东西。

一如既往 - 不要过早优化。