在Firestore Java admin SDK中断开并重新连接网络时未收到文档更新
我正在使用Java admin SDK在本地PC的Firestore中设置一个查询监视。如果网络断开并重新连接,则本地计算机将不再接收更新。我观察到,如果网络重新连接发生在短时间间隔内(<2-3分钟),则无问题。但如果时间更长,那么这个问题就会发生。此外,侦听器回调中不会通知任何错误/异常,因此我可以再次设置更新的监视。我的电脑不支持代理,因此它不能成为代理问题 请帮助我调试此问题 编辑: 看起来这是SDK中的一个bug。我启用了SDK日志并尝试了以下实验:在Firestore Java admin SDK中断开并重新连接网络时未收到文档更新,java,firebase,google-cloud-firestore,Java,Firebase,Google Cloud Firestore,我正在使用Java admin SDK在本地PC的Firestore中设置一个查询监视。如果网络断开并重新连接,则本地计算机将不再接收更新。我观察到,如果网络重新连接发生在短时间间隔内(
- 情景1:
- 观察查询更新
- 客户端设置与服务器的GRPC连接
- 看起来服务器每分钟向客户端发送一个保持活动(?),但从客户端到服务器没有保持活动
- 断开网络连接
- 在一分钟内重新连接,查询连接仍处于活动状态,文档更新按预期到达
- 断开网络连接
- 5分钟后重新连接
- 我的猜测是,服务器会从其端重置GRPC连接,因为它无法到达客户端,但SDK不知道这一点。它仍希望服务器发送保持活动状态
- 客户端未收到任何文档更新(如预期)
- 发出新查询并查看其更新
- SDK尝试通过其先前建立的同一GRPC连接发送查询,意识到该连接已关闭,并打开一个新的GRPC连接。现在,两个查询的文档更新都开始了
- 情景2:
- 观察查询更新
- 断开网络连接约5分钟
- 在重新连接网络之前发出新查询
- SDK尝试通过其先前建立的同一GRPC连接发送查询,意识到该连接已关闭,并打开一个新的GRPC连接。即使这样也会失败,但连接尝试会每分钟重试一次
- 重新连接网络
- SDK连接尝试成功,两个查询的更新开始
总之,这意味着恢复连接可能需要一些时间,您应该对此保持耐心。必须启用GRPC keepalive,以便客户端将keepalive发送到服务器并检测从服务器端关闭的任何连接。 这可以通过在初始化
FirebaseApp
时在FirestoreOptions
中提供TransportChannelProvider
来实现。
下面给出了代码片段:
InstantiatingGrpcChannelProvider channelProvider =
InstantiatingGrpcChannelProvider.newBuilder()
.setKeepAliveTime(Duration.ofSeconds(60L))
.setKeepAliveTimeout(Duration.ofMinutes(5L))
.build();
FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
.setChannelProvider(channelProvider).build();
FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(credentials).setFirestoreOptions(firestoreOptions)
.setConnectTimeout(5000).setReadTimeout(5000).build();
FirebaseApp firebaseApp = FirebaseApp.initializeApp(options);
Firestore firestore = FirestoreClient.getFirestore(firebaseApp);
事实上,我已经等了一个多小时,看看SDK是否重试并开始获得更新,但没有发生。这似乎是SDK的问题。请看我对这个问题的编辑。我已经添加了一些实验,我尝试用SDK日志启用。如果您有关于FixBaseSDK工作方式的其他问题,这些问题不能用SOF的文档或答案来解释,我认为您应该考虑联系Firebase团队。谢谢。我在github trackerOk中提出了一个问题,请随时通知我。谢谢在初始化
FirebaseApp
时,似乎有一个设置可在FirestoreOptions
中启用GRPC keepalive。请参阅我的答案以了解详细信息我不明白为什么setKeepAliveTimeout是5分钟,用大约5秒的时间来快速检测连接是否中断听起来更合理?