Home > other >  Cannot reach "worker" process in Heroku from web process: `ConnectionRefusedError`
Cannot reach "worker" process in Heroku from web process: `ConnectionRefusedError`

Time:03-01

I have a web process and an api process (a "worker" process similar to what is described in the docs and these other docs). However, I don't understand how the networking between different processes works.

Both processes are listening on 0.0.0.0, and the worker process is bound to port 5000. However, when I try to make a request from the web process, I get a ConnectionRefusedError:

ConnectionError: HTTPConnectionPool(host='0.0.0.0', port=5000): Max retries exceeded with url: /tokenize?sentence=hello (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fd307019dc0>: Failed to establish a new connection: [Errno 111] Connection refused'))

Am I supposed to figure out the IP of the other process? Am I doing something wrong here?

Procfile:

api: python app.py
web: voila UI.ipynb --port $PORT --Voila.ip=0.0.0.0

app.py:

from flask import Flask, request
from ie_utils import tokenize
app = Flask(__name__)

@app.route("/")
def home():
    return {
        "message": "Hello world!",
        "version": "0.1",
    }


if __name__ == "__main__":
    import os
    port = 5000
    app.run(host="0.0.0.0", port=port)

Relevant code in UI.ipynb:

import requests
requests.get("http://0.0.0.0:5000/")

Full source code: https://github.com/astrojuanlu/ie-titanic-utils-a/tree/test-procfile

CodePudding user response:

I don't understand how the networking between different processes works

Unless you are using Private Spaces (part of Heroku's enterprise offering), it doesn't:

The Common Runtime provides strong isolation by firewalling all dynos off from one another. The only traffic that can reach a dyno is web requests forwarded from the router to web processes listening on the port number specified in the $PORT environment variable. Worker and one-off dynos cannot receive inbound requests.

I'm not totally clear what you're trying to do here, but you won't be able to do it by making an HTTP request to localhost. You might have better luck running this as two separate apps—in that case your API could be its own web process and your Voilà app could make requests to the API app's hostname.

Side note: even on a system where this is permitted your request should not go to 0.0.0.0. That isn't a real IP address.

Telling Flask to bind to 0.0.0.0 really means that it should listen on all available IP addresses. When you want to make a request you should use one of the real hostnames or IP addresses that your system is using, e.g. localhost or 127.0.0.1 or one of its public IP addresses or hostnames.

  • Related