首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻塞IO / Ruby on Rails

阻塞IO / Ruby on Rails
EN

Stack Overflow用户
提问于 2012-01-20 21:04:38
回答 3查看 3.9K关注 0票数 12

我正在考虑用Rails编写一个web应用程序。用户提出的每个请求将取决于调用的外部API。这个外部API可能非常慢(2-3秒),因此很明显这会影响单个请求。

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

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

  1. 爱丽丝向我的网络应用程序提出了请求。为此,调用API服务器A。API服务器A速度慢,需要3秒才能完成。
  2. 在此等待期间,当Rails应用程序调用API服务器A时,Bob发出一个请求,该请求必须向API服务器B发出请求。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-20 21:13:26

如果您只使用一个单线程、非事件服务器(或不对事件服务器使用偶发I/O ),是的。使用瘦的同步性的其他解决方案将避免这种情况。

根据你的最新情况详细说明:

不,Ruby和Rails都不会导致应用程序阻塞。不过,你忽略了其中的一部分: web服务器。您要么需要多个进程、多个线程,要么需要一个事件服务器,再加上使用偶发的I/O库执行web服务请求。

@alexd使用多个进程描述。就我个人而言,我更喜欢一个偶发的服务器,因为我不需要提前知道/猜出我可能有多少并发请求(或者使用一些基于负载的并行请求)。一个面向单个nginx进程的thin进程可以为大量并行请求提供服务。

票数 8
EN

Stack Overflow用户

发布于 2012-01-20 21:52:03

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-01-20 21:12:31

很有可能是的。显然,有很多方法可以解决这一问题,但这些方法都不容易。

更好的问题是,为什么每次请求都需要访问外部API?为什么不在Rails应用程序和外部API之间实现缓存层,并将其用于大多数请求?

这样,使用一些自定义逻辑来终止缓存,您将拥有一个快速的Rails应用程序,并且仍然能够利用外部API服务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8947838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档