我是docker和生产nodejs网络应用程序的新手。但是,经过一些阅读后,我确定了一个好的设置:
但是,我现在正试图解决可扩展性问题。看你可以在nginx配置中定义多个proxy_pass
语句,你能不能启动一个重复的nodejs容器(完全相同但暴露不同的端口)并有效地“加载平衡”你的web应用程序?这是一个很好的建筑吗?
此外,此效果数据库将如何写入?我需要专门针对架构的竞争条件吗?任何指导都将不胜感激。
答案 0 :(得分: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服务的代码相同。
答案 1 :(得分:0)
您可以设置"功能级别并发执行限制"在您用于连接RDS的功能上。这将包含RDS连接的数量。但Dynamo的请求将受到限制。
另一个选择是从这个lambda将它们流式传输到Kinesis或SQS,并让另一个worker lambda从那里读取它并将数据泵入RDS。这是可扩展且可靠的,没有节流。