在Firestore Java admin SDK中断开并重新连接网络时未收到文档更新

在Firestore Java admin SDK中断开并重新连接网络时未收到文档更新,java,firebase,google-cloud-firestore,Java,Firebase,Google Cloud Firestore,我正在使用Java admin SDK在本地PC的Firestore中设置一个查询监视。如果网络断开并重新连接,则本地计算机将不再接收更新。我观察到,如果网络重新连接发生在短时间间隔内(

我正在使用Java admin SDK在本地PC的Firestore中设置一个查询监视。如果网络断开并重新连接,则本地计算机将不再接收更新。我观察到,如果网络重新连接发生在短时间间隔内(<2-3分钟),则无问题。但如果时间更长,那么这个问题就会发生。此外,侦听器回调中不会通知任何错误/异常,因此我可以再次设置更新的监视。我的电脑不支持代理,因此它不能成为代理问题

请帮助我调试此问题

编辑:

看起来这是SDK中的一个bug。我启用了SDK日志并尝试了以下实验:

  • 情景1:

  • 观察查询更新
  • 客户端设置与服务器的GRPC连接
  • 看起来服务器每分钟向客户端发送一个保持活动(?),但从客户端到服务器没有保持活动
  • 断开网络连接
  • 在一分钟内重新连接,查询连接仍处于活动状态,文档更新按预期到达
  • 断开网络连接
  • 5分钟后重新连接
  • 我的猜测是,服务器会从其端重置GRPC连接,因为它无法到达客户端,但SDK不知道这一点。它仍希望服务器发送保持活动状态
  • 客户端未收到任何文档更新(如预期)
  • 发出新查询并查看其更新
  • SDK尝试通过其先前建立的同一GRPC连接发送查询,意识到该连接已关闭,并打开一个新的GRPC连接。现在,两个查询的文档更新都开始了
  • 情景2:

  • 观察查询更新
  • 断开网络连接约5分钟
  • 在重新连接网络之前发出新查询
  • SDK尝试通过其先前建立的同一GRPC连接发送查询,意识到该连接已关闭,并打开一个新的GRPC连接。即使这样也会失败,但连接尝试会每分钟重试一次
  • 重新连接网络
  • SDK连接尝试成功,两个查询的更新开始

当您监听云Firestore数据库中的更改时,如果出现一些网络断开连接的情况,不幸的是,您无能为力。您无法控制Firebase Firestore 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秒的时间来快速检测连接是否中断听起来更合理?