2015-07-24 2 views
1

Я развернул приложение Rails на Engineyard в production и staging среде. Мне любопытно узнать, каждый запрос HTTP для моего приложения инициализирует новый экземпляр моего Rails App или нет?Rails - новый экземпляр приложения Rails, созданного для каждого HTTP-запроса в nginx/пассажире

+1

Самый короткий ответ - «нет». Не знаете, что означает вторая часть вашего вопроса. –

ответ

0

В соответствии с тем, что я понял. Нет, это определенно не будет инициализировать новый экземпляр для каждого запроса. Тогда снова могут возникнуть два вопроса.

  • Как может несколько пользователей одновременно войти в систему и получить доступ к моей системе без помех?
  • Даже если один пользователь занимает слишком много времени обработки, как другой пользователь может получить доступ к другим функциям.

Ответ на первый вопрос заключается в том, что HTTP является апатридом, все хранится в сеансе, который находится в cookie, который находится на клиентском компьютере, а не на сервере. Поэтому, когда вы отправляете HTTP-запрос для зарегистрированного пользователя, браузер фактически отправляет HTTP-запрос с необходимыми учетными данными/информацией пользователя из куки-файлов клиентов на сервер, не зная этого. Несколько запросов просто поставлены в очередь и обслуживаются соответствующим образом. Поскольку наш сервер очень быстрый, я чувствую, что он просто обрабатывается мгновенно.

Для второго запроса ваша мощь может быть параллелизмом. Сервер, который вы используете (nginx, пассажир), может одновременно обслуживать несколько запросов. Даже если наш сервер может быть занят для конкретного пользователя (скажем, для обработки видео), он может выполнять другой запрос через другой поток, чтобы несколько пользователей могли одновременно обращаться к нашей системе.

2

Rails не имеет гражданства, что означает, что каждый запрос приложения Rails имеет свою собственную среду и переменные, которые являются уникальными для этого запроса. Итак, квалифицированное «да», каждый запрос запускает новый экземпляр [1] вашего приложения; вы не можете определить, что произошло в предыдущих запросах, или другие запросы, которые происходят одновременно. Но, помните, приложение будет обслуживаться от постоянного набора работников.

С Rails на EY вы будете запускать что-то вроде тонкого или единорога в качестве веб-сервера. Это будет иметь определенное количество работников, скажем, 5. Каждый рабочий может обрабатывать только один запрос за раз, потому что это то, как работают рельсы. Поэтому, если ваши запросы занимают 200 мс каждый, это означает, что вы можете обрабатывать около 5 запросов в секунду для каждого рабочего. Если один запрос занимает много времени (несколько секунд), этот рабочий не может принимать какие-либо другие запросы. Рабочие обычно не создаются и не удаляются на Engineyard; они настраиваются и запускаются непрерывно до тех пор, пока вы не развернете их, хотя для чего-то вроде Heroku ваше приложение может не иметь никаких рабочих (dynos), и если в нем не будет запросов, им придется разворачиваться.


[1] я определяю экземпляр, как новый экземпляр класса приложения. Каждая модель и класс будут повторно созданы, а @request и @session построены с нуля.

Смежные вопросы