【问题标题】:GraphQL subscription from multiple browsers/tabs来自多个浏览器/选项卡的 GraphQL 订阅
【发布时间】:2021-12-06 00:35:24
【问题描述】:

我有一个 react 前端和一个 python 后端(使用 ariadne==0.13.0, uvicorn==0.15.0, uvicorn[standard]==0.15.0, fastapi==0.68.1)通过 graphql 订阅进行通信。只要我不重新加载页面或从同一 IP 在新的浏览器窗口中加载页面,一切正常。然后页面崩溃并需要一些时间才能恢复 - 取决于 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)

【问题讨论】:

    标签: websocket graphql fastapi uvicorn ariadne-graphql


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-02-23
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      相关资源
      最近更新 更多