如何配置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断开连接的主要内容,如果未能解决你的问题,请参考以下文章