2012-01-20 71 views
10

我在考虑用Rails编写Web应用程序。用户所做的每个请求都将取决于被调用的外部API。这个外部API可能会非常慢(2-3秒),显然这会影响个别请求。阻止IO/Ruby on Rails

在此期间,当代码正在等待外部API返回时,是否会阻止进一步的用户请求?

只是为了进一步澄清似乎有一些混乱,这是我期待的型号:

  1. 爱丽丝使请求我的web应用程序。为了实现这一点,需要调用API服务器A. API服务器A速度较慢,需要3秒才能完成。
  2. 期间,当Rails应用程序在调用API服务器A这个等待时间,鲍勃使得其具有做出API服务器B.请求

是Ruby(1.9.3)解释(请求或东西在Rails 3.x框架中)会阻止Bob的请求,要求他等待Alice的请求完成?

+0

其实我有类似的问题,但我只是想知道,你是否通过activerecord从你的Rails应用程序进行数据库查询,或者数据是纯粹从后端API服务器驱动的,它使数据库查询并将结果返回给你导轨前端? –

+0

@BennyTjia Both。个别请求将使用本地存储的数据和由API服务器返回的唯一数据。 – Matty

回答

7

如果您只使用一个单线程,非均衡服务器(或者不要使用偶数服务器使用均衡I/O),那么是的。在使用ThinEM-Synchrony的其他解决方案中将避免这种情况。

诠,根据您的更新:

没有,既不红宝石也不Rails的是要引起你的应用程序来阻止。但是你遗漏了那部分,即:Web服务器。您可能需要多个进程,多个线程,或者一个偶数服务器,以及使用一个偶数I/O库来执行您的Web服务请求。

@alexd使用多个进程描述。我个人喜欢一个平坦的服务器,因为我不需要提前知道/猜测我可能拥有多少个并发请求(或者使用某些可以根据负载加快进程速度的东西)。单个进程面向单个thin进程可以服务吨的并行请求。

+1

他仍然会遇到网络延迟。 –

+3

_Network_延迟?如果你的意思是当前的用户将被迫等待,当然他们会(但我从他写这个问题的方式假设,这是不可避免的)。我读到的问题不是为了避免用户触及外部服务的延迟,而是为了阻止其他并发请求。 – smparkes

+0

@smparkes我对这个问题进一步澄清了 – Matty

0

很可能,是的。很明显,有很多方法可以解决这个问题,但它们都不容易。

更好的问题是,为什么你需要在每个请求上点击外部API?为什么不在你的Rails应用程序和外部API之间实现一个缓存层,并将它用于大多数请求?

通过这种方式,使用一些用于过期缓存的自定义逻辑,您将拥有一个快速的Rails应用程序,并且仍然能够利用外部API服务。

+0

返回的数据随每个请求而变化。因此缓存是不可能的。 – Matty

+0

那么,你说的是你的API是你的数据库?从长远来看,这听起来不太可行...... –

+0

该API不作为数据库使用。 – Matty

3

您的问题的答案取决于您的Rails应用程序正在运行的服务器。你现在在用什么?瘦?独角兽?阿帕奇+乘客?

我全心全意地为您的情况推荐Unicorn - 它可以非常容易地并行运行多个服务器进程,并且您可以通过更改配置文件中的数字来配置并行进程的数量。当一名独角兽工作人员处理Alice的高延迟请求时,另一名Unicorn工作人员可以使用您的空闲CPU周期来处理Bob的请求。