docker 中的多个 nodejs worker

Multiple nodejs workers in docker

我对 docker 和生产 nodejs Web 应用程序还很陌生。然而,经过一些阅读后我确定一个好的设置是:

但是,我现在正在尝试解决可伸缩性问题。既然你可以在 nginx 配置中定义多个 proxy_pass 语句,你能不能启动一个重复的 nodejs 容器(完全相同但暴露不同的端口)并有效地 "load balance" 你的网络应用程序?这是一个好的架构吗?

此外,这将如何影响数据库写入?是否存在我需要专门针对其构建的竞争条件?任何指导将不胜感激。

是的,可以使用 Nginx 在 Node.js 服务的不同实例之间 负载平衡请求 。每个 Node.js 实例可以 运行 在不同的 Docker 容器中。增加配置的可扩展性就像启动另一个 Docker 容器一样简单,并确保它已在 Nginx 配置中注册。 (根据您必须更新 Nginx 配置的频率,可以使用各种 tools/frameworks 自动执行最后一步。)

例如,下面是一个 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 的功能上设置 "Function Level Concurrent Execution Limit"。这将包含 RDS 连接数。来自 Dynamo 的请求将受到限制。

另一种选择是将它们从这个 lambda 流式传输到 Kinesis 或 SQS 中,并让另一个 worker lambda 从那里读取它并将数据泵入 RDS。这是可扩展且可靠的,没有节流。