我正在考虑转移到jRuby,我仍然不确定一切是如何工作的,但让我们考虑一下这种假设情况。
一个user 1
在我的应用程序中加载一个页面需要大约2.5秒,并且在执行中大约500ms
,user 2
尝试打开不同页面,需要1秒钟才能加载。
如果我的估计是正确的,那么如果您使用单个过程在MRI中运行它会发生什么:
我的估计是否正确?
让我们说如果我在jRuby下运行相同的应用程序,就会发生这种情况:
我的其他估计是否正确?当然假设您的代码是线程安全的。如果我的估计不正确,请纠正我,或者如果它是正确的,我是否需要确保某些配置设置为rails app级别,或者我应该注意除线程安全代码之外的其他内容?
我刚刚完成了一个小型的jRuby POC应用程序,使用warbler gem构建war文件,并将战争部署到Tomcat Web服务器。我不认为我对jRuby的估计是正确的,这是我观察到的:
哪个与MRI相同,在请求处理方面,不应该jRuby并行处理这些?
我们说的是假设的事情(和假设)
如果“在我的应用程序中加载页面大约需要2.5秒”,所有用户将继续加载此内容(同时),除非您在第一次加载后对其他用户进行缓存或存储。
不同之处在于,每当执行Ruby代码时(不等待数据库等IO或从http://加载某些内容),2个线程将不会同时运行,而在JRuby中它们将会运行。
如果你在JRuby上看到User 2 waits for 3 seconds
,那就意味着smt会阻止多个请求,例如沿途某处有一个Mutex
(例如Rack::Lock
)。