2015-08-10 2 views
1

В настоящее время я рассматриваю возможность перехода на jRuby, и я до сих пор не уверен, как все будет работать, но давайте рассмотрим эту гипотетическую ситуацию.Преимущества jruby с рельсами 4

A user 1 загружает страницу в моем приложении, которое занимает около 2.5 seconds, и примерно 500ms в исполнении user 2 пытается открыть другую страницу, которая принимает 1 second для загрузки.

Если моя оценка верна, это то, что может произойти, если вы запускали его в МРТ с одним процессом:

1) User 1 waits for 2,5 seconds for his page to load 
2) User 2 waits for 3 seconds for his page to load (2 seconds waiting for user 1 to complete the loading of his page, and 1 second for his page to finish rendering) 

Является ли моя оценка правильно?

И скажем, если я побежал то же самое приложение под JRuby это будет происходить:

1) User 1 waits 2,5 seconds for his page to load 
2) User 2 waits for 1 or more seconds but less than 3, depending how much of the memory/cpu the request from user 1 takes 

ли другая моя оценка правильно? Конечно, если ваш код является потокобезопасным. Если моя оценка неверна, пожалуйста, исправьте меня, или если это правильно, мне нужно убедиться, что какая-либо конфигурация установлена ​​на уровне приложения rails или я должен быть осторожнее о чем-то другом, кроме потокобезопасного кода?

Update:

Я только что сделал небольшое приложение JRuby СПЭ, использовали WARBLER камень, чтобы построить военный файл, и развернула войну с TOMCAT веб-сервер. Я не думаю, что моя оценка верна для JRuby, это то, что я заметил:

1) User 1 waits 2,5 seconds for his page to load 
2) User 2 waits for 3 seconds 

который идентичен МРТ, с точки зрения обработки запроса, не должен обрабатывать JRuby эти параллельно?

+1

Если ваша цель состоит в обслуживании нескольких запросов асинхронно - я бы посоветовал вам посетить веб-сервер mutli-process, например [unicorn] (https://devcenter.heroku.com/articles/rails-unicorn) – Anthony

+0

@ Anthony да, это моя цель. Смогу ли я получить то же самое с Tomcat (контейнером сервлетов Java и сервером приложений), используя вместе с jruby? –

ответ

0

мы говорим были гипотетическими вещи (и допущение)

если «загружает страницу в моем приложении, которое занимает около 2,5 секунд» всех пользователей будут поддерживать загрузку этой вещь (по совместительству), если, конечно, вы делаете некоторое кэширование или сохранение его после первой загрузки для других пользователей.

Разница заключается в том, что в MRI всякий раз, когда выполняется Ruby-код (не дожидаясь IO, например, базы данных или загружая что-то из http: //), 2 потока не будут запускаться одновременно, в то время как в JRuby они будут.

Если вы видите User 2 waits for 3 seconds на JRuby, это означает, что smt блокирует несколько запросов, например. есть Mutex где-то вдоль пути (например, Rack::Lock).