Несколько рабочих nodejs в докере
Я очень новичок в докере и разработке web-приложений nodejs. Однако после некоторого прочтения я определил, что хорошей настройкой будет:
- Контейнер nginx, обслуживающий статические файлы, ssl, прокси-запросы nodejs
- контейнер nodejs
- контейнер postgesql
Однако сейчас я пытаюсь решить проблему масштабируемости. Видя, как вы можете определить несколько proxy_pass
операторы в конфигурации nginx, не могли бы вы развернуть дубликат контейнера nodejs (точно такой же, но с другим портом) и эффективно "сбалансировать нагрузку" вашего веб-приложения? Это хорошая архитектура?
Кроме того, как этот эффект записывает в базу данных? Существуют ли условия гонки, для которых мне нужна архитектура? Любое руководство будет оценено.
2 ответа
Да, можно использовать Nginx для загрузки запросов баланса между различными экземплярами ваших сервисов Node.js. Каждый экземпляр Node.js может работать в другом контейнере Docker. Повысить масштабируемость вашей конфигурации так же просто, как запустить другой контейнер Docker и убедиться, что он зарегистрирован в конфигурации Nginx. (В зависимости от того, как часто вам приходится обновлять конфигурацию Nginx, для выполнения этого последнего шага доступны различные инструменты / платформы.)
Например, ниже приведена конфигурация Nginx для балансировки нагрузки входящих запросов между различными сервисами Node.js. В нашем случае у нас есть несколько служб Node.js, работающих на одном компьютере, но вместо этого вполне возможно использовать контейнеры Docker.
файл /etc/nginx/sites-enabled/apps
:
upstream apps-cluster {
least_conn;
server localhost:8081;
server localhost:8082;
server localhost:8083;
keepalive 512;
}
server {
listen 8080;
location "/" {
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_set_header Connection "";
proxy_http_version 1.1;
proxy_pass http://apps-cluster;
}
access_log off;
}
Несмотря на запуск нескольких экземпляров ваших служб Node.js, ваша база данных не должна подвергаться негативному воздействию. Сама база данных PostgreSQL может прекрасно обрабатывать несколько открытых соединений и автоматически разрешать любые условия гонки. С точки зрения разработчика, код для запуска службы 1 Node.js такой же, как и для запуска служб x Node.js.
Вы можете установить "Предел одновременного выполнения на уровне функций" для функции, которую вы используете для подключения к RDS. Это будет содержать количество соединений RDS. Однако запросы от "Динамо" будут сокращены.
Другой вариант - направить их в Kinesis или SQS из этой лямбды и попросить другую рабочую лямбду прочитать ее оттуда и перекачать данные в RDS. Это масштабируемо и надежно без регулирования.