来自多个 browsers/tabs 的 GraphQL 订阅

GraphQL subscription from multiple browsers/tabs

我有一个反应前端和一个 python 后端(使用 ariadne==0.13.0, uvicorn==0.15.0, uvicorn[standard]==0.15.0, fastapi==0.68.1)通过 graphql 订阅进行通信。只要我不重新加载页面或从同一 IP 在新浏览器 window 中加载页面,一切都正常。然后页面崩溃并需要一些时间来恢复 - 取决于 uvicorn 中配置的 websocket 超时。我的前端和 graphql playgorund 都遇到了同样的问题。 我知道不同的浏览器或选项卡使用相同的 IP、端口和协议标识,这可能会扰乱现有连接,但仍然应该可以使用不同选项卡中的页面,如下所示: https://fastapi.tiangolo.com/advanced/websockets/

我的代码:

SCHEMA = load_schema_from_path("schema.graphql")
query = QueryType()
subscription = SubscriptionType()
app = FastAPI()
schema = make_executable_schema(SCHEMA, [query, subscription])
graphql_server = GraphQL(schema, debug=True)
app.add_route("/graphql", graphql_server)
app.add_websocket_route("/graphql", graphql_server)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["POST", "GET"],
    allow_headers=[
        "accept",
        "accept-language",
        "content-language",
        "content-type",
        "x-apollo-tracing",
    ],
)
app.debug = True
uvicorn.run(app, host='0.0.0.0', port=7996)

uvicorn 的默认设置是单线程的,实现订阅的方法是同步和阻塞的。我不得不以异步方式重新实现它。