Docker containers and Node.js clusters

后端 未结 3 528
慢半拍i
慢半拍i 2021-01-31 04:08

I have an api server running Node.js that was using it\'s cluster module and testing looked to be pretty good. Now our IT department wants to move to using Docker containers whi

相关标签:
3条回答
  • 2021-01-31 04:50

    I have a system with 4 logical cores with me and I ran following line on my machine as well as on docker installed on same machine.

    const numCPUs = require('os').cpus().length;
    console.log(numCPUs)
    

    This lines prints 4 on my machine and 2 inside docker container. Which means if we use clustering in docker container only 2 instance would be running. So docker container doesn't see cores same as actual machine does. Also running 5 docker container with clustering mode enabled gives 10 instance of machine which ultimately be manages by kernel of OS with 4 logical cores.

    So I think best approach is to use multiple docker container instance in swarm mode with node.js clustering disabled. This should give the best performance.

    0 讨论(0)
  • 2021-01-31 04:52

    What I've seen as the best solution when using Docker is to keep as fewer processes per container as possible since containers are lightweight; you don't want processes trying to use more than one CPU. So, running a cluster in the container won't add any value and might worsen latency.

    Here https://medium.com/@CodeAndBiscuits/understanding-nodejs-clustering-in-docker-land-64ce2306afef#.9x6j3b8vw Chad Robinson explains the idea in general terms.

    Kubernetes, Rancher, Mesos and other container management layers handle the load-balancing. They provide "scheduling" (moving those Docker container slices around different CPUs and machines to get a good usage across the cluster) and "networking" (load balancing inbound requests to those containers) layers internally.

    Update

    I think it's worth adding the link Why it is recommended to run only one process in a container? where people share their ideas and experiences, but chiefly from Jon there are some interesting points:

    Provided that you give a single responsibility (single process, function or concern) to a container: Good idea Docker names this 'concern' ;)

    • Scaling containers horizontally is easier.
    • It can be re-used in different projects.
    • Identifying issues and troubleshooting is a breeze compared to do it in an entire application environment. Also, logging and reporting can be more accurate and detailed.
    • Upgrades/Downgrades can be gradually and fully controlled.
    • Security can be applied to specific resources and at different levels.
    0 讨论(0)
  • 2021-01-31 04:58

    You'll have to measure to be sure, but my hunch would be running with node's cluster module would be worthwhile. It would get you more CPU utilization with the least amount of extra overhead. No extra containers to manage (start, stop, monitor). Plus the cluster workers have an efficient communication mechanism. The most reasonable evolution (don't skip steps) would seem to me:

    1. 1 container, 1 node process
    2. 1 container, several clustered node workers
    3. several containers, each with several node workers
    0 讨论(0)
提交回复
热议问题