heroku-redis

I keep getting this Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch


I recently installed Heroku Redis. Until then, the app worked just fine. I am using Bull for queuing and ioredis as the redis library. I had connection issues initially but I have resolved that as I no longer get the error. However, this new Error described shows up.

Please check these details below;

Package.json Start Script

"scripts": {
    "start": "sh ./run.sh"
  }

run.sh file

node ./app/services/queues/process.js &&
node server.js

From the logs on the heroku console, I see this.

  1. Processing UPDATE_USER_BOOKING... Press [ctrl C] to Cancel

  2. {"level":"info","message":"mongodb connected"}

1 is my log in the process script. This tells me that the consumer is running and ready to process any data it receives. 2 Tells me that mongo is connected. It can be found in my server.js(entry file).

My challenge is after those 2 lines, it then shows this;

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch Stopping process with SIGKILL

Error waiting for process to terminate: No child processes

Process exited with status 22

State changed from starting to crashed

So, I don't know why this is happening even when I have the PORT sorted out already as described in their docs. See this for clarity:

app.listen(process.env.PORT || 4900, ()=>{})

Note: It was working before until I introduced the Redis bit just a day ago.

Could there be an issue with the way I am running both server and the Queue process in the package.json file? I have been reading answers similar to this, but they are usually focused on the PORT fix which is not my own issue as far as I know.

TroubleShooting : I removed the queue process from the start script and the issue was gone. I had this instead

"scripts": {
    "start": "node server.js -p $PORT"
  }

So it becomes clear that this line below;

node ./app/services/queues/process.js was the issue

Now, How then do I run this queue process script? I need it to run to listen to any subscription and then run the processor script. It works fine locally with the former start script.

Please Note: I am using Bull for the Queue. I followed this guide to implement it and it worked fine locally. Bull Redis Implementation Nodejs Guide

I will appreciate any help on this as I am currently blocked on my development.


Solution

  • So I decided to go another way. I read up on how to run background jobs on heroku with Bull and I got a guide which I implemented. The idea is to utilize Node's concurrency API. For the guide a wrapper was used called throng to implement this. I removed the process file and just wrapped my consumer script inside the start function and passed that to throng.

    Link to heroku guide on enabling concurrency in your app

    Result: I started getting EADDR in use Error which was because that app.listen() is being run twice.. Solution: I had to wrap the app.listen function inside a worker and pass it to throng and it worked fine. Link to the solution to the EADDR in use Error

    On my local Machine, I was able to push to the Queue and consume from it. After deploying to heroku, I am not getting any errors so far.

    I have tested the update on heroku and it works fine too.