запускать несколько экземпляров веб-службы для ruby ​​/ python кажется мне взломом - PullRequest
1 голос
/ 03 августа 2010

Это только у меня или приходится запускать несколько экземпляров веб-сервера для масштабирования взлома?

Я не прав в этом?

Разъяснение

Я имею в виду, как я читаю, люди запускают несколько экземпляров веб-службы на одном сервере . Я не говорю о кластере серверов.

Ответы [ 6 ]

4 голосов
/ 03 августа 2010

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

Так что да, я считаю, что вы не правы.

Это ни в коем случае не оправдывает умственно отсталое программирование тем предлогом, что вы можете просто масштабировать его по горизонтали, что кажется запаздывающим.

4 голосов
/ 03 августа 2010

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

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

Infact, использующий интерфейсы асинхронного стиля, дает лучшую производительность на том же оборудовании, чем многопоточный подход, поэтому я бы сказал, что не запуск нескольких экземпляров в пользу многопоточного монстра - это хак

1 голос
/ 04 августа 2010

Я бы не решился сказать, что проблема в «взломе».Или действительно, что резьбовые решения обязательно превосходят.

Ситуация является результатом дизайнерских решений, используемых в интерпретаторах таких языков, как Ruby и Python.

Я работаю с Ruby, поэтому детали могут отличаться для других языков.

НО ... по сути, Ruby использует глобальную блокировку интерпретатора для предотвращения проблем с потоками: http://en.wikipedia.org/wiki/Global_Interpreter_Lock

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

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

В старые времена (2-3 года назад) мы запускали несколько монгрел (или аналогичных) экземпляров за прокси-сервером (обычно apache).Пассажир кое-что изменил, потому что он достаточно умен, чтобы управлять самими процессами, а не требует ручной настройки.Вы говорите Пассажиру, сколько процессов он может использовать, и он отключается.

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

Если вы используете язык, такой как JRuby, вы можете развернуть его на сервере многопоточных приложений, таком как Tomcat, и иметь развертывание, которое выглядит гораздо более «похожим на Java».Тем не менее, это не такая большая победа, как вы думаете, потому что теперь ваше приложение должно быть гораздо более ориентированным на потоки, и вы можете увидеть побочные эффекты и странность от проблем с потоками.

1 голос
/ 03 августа 2010

Даже если бы интерпретаторы Ruby / Python были безупречны и могли использовать все имеющиеся ресурсы ЦП с одним процессом, вы все равно рано или поздно достигли бы максимальной производительности одного сервера и вам пришлось бы масштабироваться на нескольких машинах, возвращаясь к запуску нескольких экземпляров вашего сервера.приложение.

1 голос
/ 03 августа 2010

Без подробностей очень трудно понять, к чему вы клоните.При этом вполне возможно, что вы просто не используете правильный подход к своей проблеме.

Иногда лучше использовать несколько отдельных экземпляров.Иногда ваши службы Python лучше развернуть за одним экземпляром Apache (используя mod_wsgi), который может выбрать более одного процесса.Я не знаю, как Руби будет там высказываться.

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

0 голосов
/ 04 августа 2010

Ваше предположение о том, что один процесс Tomcat и IIS на сервер является превосходным, ошибочно.Выбор многопоточного сервера и многопроцессорного сервера зависит от множества переменных.

Одной из основных вещей является базовая операционная система.В Unix-системах всегда была отличная поддержка многопроцессорной обработки из-за природы копирования вызова при записи системного вызова fork.Это делает многопроцессорность действительно привлекательным вариантом, поскольку веб-обслуживание обычно очень распространено, и вам не нужно беспокоиться о блокировке.С другой стороны, в Windows были гораздо более тяжелые процессы и более легкие потоки, поэтому такие программы, как IIS, склонились бы к многопоточности.

Что касается вопроса о том, стоит ли взламывать несколько серверов, то это действительно зависит от вашей перспективы.Если вы посмотрите на Apache, он поставляется с различными подключаемыми движками на выбор.MPM-prefork one используется по умолчанию, поскольку он позволяет программисту легко использовать не-поточно-ориентированные библиотеки C / Perl / базы данных без необходимости повсеместно создавать блокировки и семафоры.Для некоторых это может быть хаком для работы с плохо реализованными библиотеками.Для меня это блестящий способ оставить это для ОС для решения проблем и позволить мне вернуться к работе.

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

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

Это хак?И да и нет.Обе оригинальные реализации (MRI и CPython) имеют глобальные блокировки интерпретатора, которые не позволят многоядерному серверу работать с его 100% -ным потенциалом.С другой стороны, многопроцессорность имеет свои преимущества (особенно на стороне Unix).

В самих языках нет ничего, что заставляло бы их требовать GIL, поэтому вы можете запускать свое приложение сJython, JRuby, IronPython или IronRuby, если вы действительно хотите поделиться состоянием внутри одного процесса.

...