来自多个 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 的默认设置是单线程的,实现订阅的方法是同步和阻塞的。我不得不以异步方式重新实现它。
我有一个反应前端和一个 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 的默认设置是单线程的,实现订阅的方法是同步和阻塞的。我不得不以异步方式重新实现它。