How to achieve truly zero downtime deployment using pm2?

Subscribe to my newsletter and never miss my upcoming articles

If you are running any Node/Express apps in production, you are most likely using PM2 to manage them. One of the cool features of pm2 is that it lets you run your app in cluster mode with multiple instances. One of the benefits of this approach is that you can achieve zero downtime deployment.

pm2 start app.js -i 2
pm2 reload app

PM2 achieves this by restarting the instances one by one. After instance-0 is successfully restarted, instance-1 is rebooted. This makes sure that there is at least one instance to accept the requests.

However, if your app is doing something heavy during the startup or if there is a slight delay, you might see some downtime (maybe for a couple of seconds). After instance-0 is restarted, it may not be able to service the requests immediately. So, the deployment is not zero-downtime anymore.

Fix

Use --wait-ready flag to tell pm2 when your process is up and is able to accept requests.

pm2 start app.js -i 2 --wait-ready

In your Node app, you add the following piece of code when it's ready:

process.send('ready');

This makes sure pm2 reload moves to the next instance of the process only after the previous one is truly up and is able to service the incoming requests.

If your app takes more than 3s to start, you need to increase the timeout as following:

pm2 start app.js -i 2 --wait-ready --listen-timeout 5000

Now pat yourself on the back! You can now deploy 🚀 your app with 0 downtime.

For more details, visit pm2.keymetrics.io/docs/usage/pm2-doc-single..

Comments (1)

Yashu Mittal's photo

Can you share your thoughts on pm2 file based configuration?