2015-06-25 5 views
2

Как Rails обрабатывает несколько запросов от разных пользователей без столкновения? Какова логика?Как Rails обрабатывает несколько входящих запросов?

Например, пользователь1 вошел в систему и просматривает сайт. В то же время пользователь2, user3, ... регистрируются и просматривают. Как рельсы управляют этой ситуацией без конфликтов данных между пользователями?

ответ

3

Следует иметь в виду, что даже если пользователи используют сайт одновременно в своих браузерах, сервер может обрабатывать только один запрос за раз. Обработка запроса может занять менее секунды, поэтому запросы могут быть помещены в очередь для обработки, не вызывая значительных задержек для пользователей. Каждый ответ начинается с чистого листа, беря только информацию из запроса и используя его для поиска данных из базы данных. он не переносит ничего с одного запроса на другой. Это называется парадигмой без гражданства.

Если нагрузка увеличивается, можно добавить больше серверов рельсов. Поскольку каждый ответ начинается с нуля в любом случае, добавление большего количества серверов не создает никаких проблем, связанных с «совместным использованием информации», поскольку вся информация либо отправляется в запрос, либо загружается из базы данных. Это просто означает, что больше запросов может обрабатываться в секунду.

Когда возникает ощущение «непрерывности» для пользователя, например, находящегося на веб-сайте, это делается с помощью файлов cookie, которые хранятся на их машине и отправляются как часть запроса. Сервер может считывать эту информацию cookie из запроса и, например, НЕ перенаправлять кого-либо на страницу входа, поскольку куки-файл сообщает им, что они уже вошли в систему как пользователь 123 или что-то еще.

+0

Балансиры нагрузки могут распределять задания на несколько серверов, которые могут работать одновременно. – sawa

+0

Я знаю. Извините, я не понимаю вашу точку зрения. –

+0

Вы писали, что запросы не могут одновременно обрабатываться серверами. Это не правильно. Это база данных, которая контролирует это. – sawa

1

Это гарантируется не Rails, а базой данных, которую использует веб-сервис. Вы упомянули свойство isolation. Это один из нескольких свойств, которым должна удовлетворять практическая база данных, известная как ACID.

0

В качестве дополнительного случая Вы могли бы использовать что-то вроде «пума» многопоточного сервера ...

2

В случае, если ваш вопрос о том, как Rails отличаются пользователей ответом будет, что использует куки для хранения сессии. Вы можете больше узнать об этом here.

Также данные не конфликтуют, так как вы получаете свежий экземпляр контроллера для каждого запроса

RailsGuides:

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

1

Это достигается использованием a "session": совокупность данных, специфичных для данного клиента, доступных на стороне сервера.

Есть plenty of ways для сервера для хранения сессии, как правило, Rails использует cookie: небольшие (обычно около 4 кБ) набор данных, который хранится в браузере пользователя и отправленного с каждым запросом. По этой причине вы не хотите слишком много хранить там. Однако вам, как правило, не нужно многого, вам нужно всего лишь достаточно, чтобы идентифицировать пользователя и все еще затруднять выдачу себя за него.

Из-за этого Rails хранит сеанс сам в файле cookie (как говорит this guide). Это просто и не требует установки. Некоторые считают, что хранилище файлов cookie ненадежно и вместо этого используют механизмы персистентности: базы данных, хранилища ключей и т. П.

Обычно рабочий процесс выглядит следующим образом:

  • идентификатор сеанса хранится в куки, когда сервер решает инициализировать сеанс
  • Сервер принимает запрос от пользователя, извлекает сеанс его идентификатор
  • Если сеанс говорит, что она представляет пользователю X, Rails действует как если бы это на самом деле ему

поскольку различные пользователи отправляют различные идентификаторы сессии, Rails обрабатывает их как отличаются и выводит данные, относящиеся к обнаруженному: по запросу.

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

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