docker中的多个nodejs worker

时间:2015-10-12 19:20:07

标签: node.js nginx docker production-environment

我是docker和生产nodejs网络应用程序的新手。但是,经过一些阅读后,我确定了一个好的设置:

  • nginx容器提供静态文件,ssl,代理nodejs请求
  • nodejs container
  • postgesql容器

但是,我现在正试图解决可扩展性问题。看你可以在nginx配置中定义多个proxy_pass语句,你能不能启动一个重复的nodejs容器(完全相同但暴露不同的端口)并有效地“加载平衡”你的web应用程序?这是一个很好的建筑吗?

此外,此效果数据库将如何写入?我需要专门针对架构的竞争条件吗?任何指导都将不胜感激。

2 个答案:

答案 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。这是可扩展且可靠的,没有节流。