无法从 Web 进程到达 Heroku 中的 "worker" 进程:`ConnectionRefusedError`

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

我有一个 web 进程和一个 api 进程(类似于 the docs and these other docs 中描述的“工作”进程)。但是,我不明白不同进程之间的网络是如何工作的。

两个进程都在监听 0.0.0.0,工作进程绑定到端口 5000。但是,当我尝试从 web 进程发出请求时,我得到一个 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'))

我应该找出另一个进程的 IP 吗?我是不是做错了什么?

过程文件:

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)

UI.ipynb中的相关代码:

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

完整源代码:https://github.com/astrojuanlu/ie-titanic-utils-a/tree/test-procfile

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

除非你正在使用 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.

我不是很清楚你想在这里做什么,但你无法通过向本地主机发出 HTTP 请求来完成。你可能会更好 运行 这作为两个独立的应用程序 - 在这种情况下你的 API 可能是它自己的 web 进程并且你的 Voilà 应用程序可以向 API 应用程序的请求主机名。

旁注:即使在允许这样做的系统上,您的请求也不应转到 0.0.0.0。这不是真实的 IP 地址。

告诉 Flask 绑定到 0.0.0.0 实际上意味着它应该监听所有可用的 IP 地址。当你想发出请求时,你应该使用你的系统正在使用的真实主机名或 IP 地址之一,例如localhost127.0.0.1 或其 public IP 地址或主机名之一。