Как создать распределенное приложение node.js?
Создание приложения node.js достаточно просто.
var app = require('express')();
app.get('/',function(req,res){
res.send("Hello world!");
});
Но предположите, что люди стали одержимы вашим приложением Hello World!
и исчерпали свои ресурсы. Как этот пример может быть расширен на практике? Я не понимаю этого, потому что да, вы можете открыть несколько экземпляров node.js на разных компьютерах, но когда кто-то обратится к http://your_site.com/, он прямо нацелен на то, что конкретные machine, этот конкретный порт, этот конкретный процесс node. Итак, как?
Ответы
Ответ 1
Есть много способов справиться с этим, но это сводится к двум вещам:
- возможность использования большего количества ядер на сервер
- возможность масштабирования более чем на одном сервере.
node -cluster
Для первого варианта вы можете использовать пользователь node-cluster
или то же решение, что и для опции seconde. node-cluster
(http://nodejs.org/api/cluster.html) по существу является встроенным способом для преобразования процесса node в один мастер и несколько рабочих. Как правило, вам нужны 1 мастер и n-1 до n сотрудников (n - ваше количество доступных ядер).
балансировщики нагрузки
Второй вариант - использовать балансировщик нагрузки, который распределяет запросы среди нескольких сотрудников (на одном сервере или на разных серверах).
Здесь у вас есть несколько вариантов. Вот несколько:
Еще одна вещь: после того, как вы начнете выполнять несколько запросов, обслуживающих запросы, вы больше не сможете использовать память для хранения состояния, вам нужна дополнительная служба для хранения общих состояний, Redis (http://redis.io) является популярным выбором, но отнюдь не единственным.
Если вы используете такие сервисы, как cloudfoundry, heroku и другие, они настраивают его для вас, поэтому вам нужно только беспокоиться о своей логике приложений (и использовать службу для работы с общим состоянием).
Ответ 2
Я работаю с node в течение довольно долгого времени, но недавно получил возможность попробовать масштабировать свои приложения node и уже некоторое время занимаюсь исследованиями по той же теме и натолкнулся на следующие предварительные условия для масштабирование:
-
Мое приложение должно быть доступно в распределенной системе, каждая из которых запускает несколько экземпляров node
-
Каждая система должна иметь балансировщик нагрузки, который помогает распределять трафик через экземпляры node.
-
Должен быть основной балансировщик нагрузки, который должен распределять трафик через экземпляры node в распределенных системах.
-
Мастер-балансир всегда должен быть запущен или должен иметь надежный механизм перезапуска, чтобы поддерживать стабильность приложения.
Для вышеуказанных реквизитов я столкнулся с следующим:
-
Используйте модули типа cluster, чтобы запустить несколько экземпляров node в системе.
-
Всегда используйте nginx. Это один из самых простых механизмов создания балансировщика нагрузки, на который я до сих пор сталкивался.
-
Используйте HAProxy, чтобы действовать как основной балансировщик нагрузки. A несколько указателей о том, как использовать его и поддерживать навсегда.
Полезные ресурсы:
Я буду продолжать обновлять этот ответ по мере продвижения.
Ответ 3
Основной способ использования нескольких машин - разместить их за балансировщиком нагрузки и указать весь трафик на балансировщик нагрузки. Таким образом, кто-то отправится в http://my_domain.com, и он укажет на машину балансировки нагрузки. Единственная цель (для этого примера в любом случае, теоретически может быть сделано) балансировки нагрузки - это делегировать трафик на заданную машину, на которой выполняется ваше приложение. Это означает, что у вас может быть x количество компьютеров, на которых запущено ваше приложение, однако внешняя машина (в данном случае браузер) может перейти на адрес балансировки нагрузки и перейти к одному из них. Клиент не (и не должен) знать, какая машина фактически обрабатывает свой запрос. Если вы используете AWS, довольно легко настроить и управлять этим. Обратите внимание, что ответ Pascal содержит более подробные сведения о ваших вариантах.
С Node в частности, вы можете захотеть просмотреть модуль Node Cluster. У меня на самом деле нет большого опыта работы с этим модулем, однако он должен позволить вам запускать несколько процессов вашего приложения на одной машине, все используют один и тот же порт. Также Node, что он все еще экспериментальный, и я не уверен, насколько он будет надежно.
Ответ 4
Я бы рекомендовал взглянуть на http://senecajs.org, набор инструментов для микросервисов для Node.js. Это хорошая начальная точка для начинающих и начать думать о "услугах" вместо монолитных приложений.
Сказав, что создание распределенных приложений затруднено, уделите время изучению, LOT времени, чтобы овладеть им, и обычно вам придется столкнуться с большим компромиссом между производительностью, надежностью, и др.