如何配置graphql-flutter和apollo sever以使应用程序停止与websocket断开连接

Posted

技术标签:

【中文标题】如何配置graphql-flutter和apollo sever以使应用程序停止与websocket断开连接【英文标题】:How to configure graphql-flutter and apollo sever that to make app stop disconnecting from websocket 【发布时间】:2021-01-16 14:46:15 【问题描述】:

我正在使用 graphql-flutter 包的 Flutter 上构建应用程序,我的配置如下所示:

final WebSocketLink websocketLink = WebSocketLink(
    url: subscriptionUri,
    config: SocketClientConfig(
        autoReconnect: true,
        initPayload: () 
          return authTokenService.addAuthHeader(EnvVariables.currentHost);
        ));

link = link.concat(websocketLink);

同样在后端我使用 Apollo graphql 订阅和 redis 用于 PubSub,condfig 看起来像这样:

this.pubsub = new RedisPubSub(
            publisher: new Redis(process.env.REDIS_URL),
            subscriber: new Redis(process.env.REDIS_URL),
        );

和阿波罗

const apolloServer = new ApolloServer(
    schema,
    subscriptions: 
        keepAlive: 30000,  
    ...

所有这些都托管在 Heroku 上(不是 prod 环境 - 免费的 - 也许这是一个问题) 所以我的应用程序不断断开连接并重新连接到 websocket。

就在断开连接之前,我收到一条消息:30 秒内没有收到保持活动消息。正在断开连接...

但是如果我在 graphql-flutter 包中将 null 传递给 inactivityTimeout

final WebSocketLink websocketLink = WebSocketLink(
    url: subscriptionUri,
    config: SocketClientConfig(
        autoReconnect: true,
        inactivityTimeout: null,
        initPayload: () 
          return authTokenService.addAuthHeader(EnvVariables.currentHost);
        ));

link = link.concat(websocketLink);

一段时间后,应用程序抛出错误 - 已达到最大重试次数限制。

那么我应该如何正确配置双方?我应该发送keepAlive消息还是只是在颤动方面忽略它们,但是如何避免最大重试错误? 或者我应该手动向频道发送任何消息以使其保持活跃,就像它在这里所说的那样:https://devcenter.heroku.com/articles/play-java-websockets-advanced(但我希望阿波罗服务器会为我做这件事......)

谢谢

【问题讨论】:

【参考方案1】:

由于这个库没有活跃的维护者,我使用了自定义 fork 来替换 websocket 客户端。 https://github.com/zino-app/graphql-flutter/issues/892

【讨论】:

以上是关于如何配置graphql-flutter和apollo sever以使应用程序停止与websocket断开连接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NestJS GraphQL 实现 NuxtJS Apollo

SpringBoot集成Apollo配置中心

快速入门 Nacos 作为配置中心操作

配置中心动态代理实现

无法拉取apollo配置的可能原因

使用 GraphQL 的 Angular2 服务和路由解析器