我正在使用Ruby Grape创建一个API,我面临以下问题。 当有新的GET请求时,会请求大量数据,这需要很长时间,同时Reactor被阻止,在请求完成之前不会处理任何新请求。 代码很简单:
class API < Grape::API
resource :users do
get do
get_users()
end
end
end
get_users通过TCP连接到另一个系统,并获取大量数据转换为JSON。这是使用第三方gem完成的。 什么是处理这种情况的最佳选择?
答案 0 :(得分:0)
我想到两个选择:
此外,如果它合适 - 您可以缓存get_users()
的结果答案 1 :(得分:0)
您的应用程序执行长时间运行的阻止I / O操作。为了很好地处理这些类型的工作负载,您的系统需要支持高I / O并发性。
传统的单线程多进程系统(如Phusion Passenger开源和Unicorn)不适合这些类型的工作负载。他们可以处理的并发数量受进程数量的限制。这个问题记录在Unicorn的philosophy page,“在某些情况下更糟糕”部分,或最近关于tuning Phusion Passenger's concurrency的Phusion文章中。
虽然Thin理论上能够处理由于其I / O模型的高I / O并发性,但必须明确编写应用程序和框架以利用这一点。很少有框架可以做到这一点。 Rails和Sinatra都不支持事件I / O. Cramp支持它,还有另一个新的公平框架,我的名字已经忘记了。但似乎Grape不支持事件I / O.
解决方案是切换到支持多线程的应用程序服务器,它还能够支持高I / O并发性。一个这样的应用服务器是Phusion Passenger 4 Enterprise,它支持混合多线程/多进程模型。多线程是并发性的,而多进程是为了稳定性和利用多个CPU核心的能力。 Phusion博客describes optimal concurrency settings for different workloads.