docker 中的多个 nodejs worker
Multiple nodejs workers in docker
我对 docker 和生产 nodejs Web 应用程序还很陌生。然而,经过一些阅读后我确定一个好的设置是:
- nginx 容器提供静态文件、ssl、代理 nodejs 请求
- nodejs 容器
- postgesql 容器
但是,我现在正在尝试解决可伸缩性问题。既然你可以在 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。这是可扩展且可靠的,没有节流。
我对 docker 和生产 nodejs Web 应用程序还很陌生。然而,经过一些阅读后我确定一个好的设置是:
- nginx 容器提供静态文件、ssl、代理 nodejs 请求
- nodejs 容器
- postgesql 容器
但是,我现在正在尝试解决可伸缩性问题。既然你可以在 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。这是可扩展且可靠的,没有节流。