Несколько рабочих 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. Это масштабируемо и надежно без регулирования.

Другие вопросы по тегам