在Rails上阻止IO/Ruby

Mat*_*tty 12 ruby ruby-on-rails blocking

我正在考虑用Rails编写Web应用程序.用户做出的每个请求都取决于被调用的外部API.这个外部API可以随机非常慢(2-3秒),因此显然会影响单个请求.

在代码等待外部API返回的这段时间内,是否会阻止进一步的用户请求?

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

  1. Alice向我的网络应用程序发出请求.为此,将调用API服务器A. API服务器A很慢,需要3秒才能完成.
  2. 在Rails应用程序调用API服务器A的等待时间内,Bob发出一个请求,该请求必须向API服务器B发出请求.

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

smp*_*kes 8

如果您只使用一个单线程,非事件服务器(或者不使用带有事件服务器的事件I/O),是的.使用ThinEM-Synchrony的其他解决方案将避免这种情况.

根据您的更新进行阐述:

不,Ruby和Rails都不会导致您的应用程序被阻止.但是你遗漏了那部分:Web服务器.您需要多个进程,多个线程或一个事件服务器,以及使用事件I/O库执行Web服务请求.

@alexd描述了使用多个进程.我个人支持一个事务服务器,因为我不需要提前知道/猜测我可能有多少并发请求(或使用基于负载来旋转进程的东西.)nginx面向单个thin进程的单个进程可以服务器大量的并行请求.

  • _Network_延迟?如果你的意思是当前的用户将被迫等待,当然他们会(但我从他写的问题的方式假设,这是不可避免的).我读的问题不是关于避免用户访问外部服务的延迟,而是关于阻止其他并发请求. (3认同)