【问题标题】:Firestore Client SDK cold start?Firestore 客户端 SDK 冷启动?
【发布时间】:2022-11-10 23:10:20
【问题描述】:

简而言之:直接从 Client SDK 连接到 Firestore 时是否存在某种冷启动

嘿。我通过@react-native-firebase 在Andoid 和IOS 应用程序中使用Firestore 客户端sdk。 一切正常,但我注意到我没有找到解释的奇怪行为。 我已经进行了日志记录,以查看从用户登录到从 Firestore 检索 uid 相应数据需要多长时间,这次大约是 0.4-0.6 秒。这基本上是整个 onAuthStateChanged 工作流程。

    let userLoggedIn: Date;
    let userDataReceived: Date;
    auth().onAuthStateChanged(async (user) => {
        userLoggedIn = new Date();
    
        const eventsRetrieved = async (data: UserInformation) => {
          userDataReceived = new Date();

          getDataDuration = `Get data duration: ${(
            (userDataReceived.getTime() - userLoggedIn.getTime()) /
            1000
          ).toString()}s`;

         console.log(getDataDuration)

          // function to check user role and to advance timing logs
          onUserDataReceived(data);
        };
    
        const errorRetrieved = () => {
          signOut();
          authStateChanged(false);
        };
    
        let unSub: (() => void) | undefined;
    
        if (user && user.uid) {
    
          const userListener = () => {
            return firestore()
              .collection('Users')
              .doc(user.uid)
              .onSnapshot((querySnapshot) => {
                if (querySnapshot && querySnapshot.exists) {
                  const data = querySnapshot.data() as UserInformation;
                  data.id = querySnapshot.id;
                  eventsRetrieved(data);
                } else errorRetrieved();
              });
            };
    
          unSub = userListener();
       } else {
          if (typeof unSub === 'function') unSub();
          authStateChanged(false);
       }
    });

现在的问题。当我在上次打开后约 30-50 分钟打开应用程序时,从 Firestore 检索 uid 相应数据的时间将是约 3-9 秒。这次是什么时候,为什么会发生?在我打开应用程序之后,这个时间会再次变低~0.4-0-6s。
我已经经历了几周的这种行为。很难调试,因为它只发生在构建应用程序(不在本地环境中)并且仅在 +30 分钟间隔之间发生。

注意事项

  • 监听器查询(我在这种情况下使用,我也使用了简单的 getDoc 函数)非常简单,并且专注于单个文档,所有项目配置都运行良好。只有在这个看似冷启动的时间间隔内,才会出现较长的数据检索持续时间。
  • Firestore 规则不应降低查询速度,因为后续请求速度很快。 'Users' 集合的规则在伪代码中如下所示:
function checkCustomer(){
  let data = 
  get(/databases/$(database)/documents/Users/$(request.auth.uid)).data;
      return (resource.data.customerID == data.customerID);
    } 

match /Users/{id}{
  allow read:if
    checkUserRole() // Checks user is logged in and has certain customClaim
    && idComparison(request.auth.uid, id) // Checks user uid is same as document id
    && checkCustomer() // User can read user data only if data is under same customer
  }
  • 设备缓存似乎不会影响该问题,因为可以清除应用程序的缓存并且仍然会发生“冷启动”
  • 可以从另一个环境或仅从另一个移动设备调用 Firestore,并且这种“冷启动”将单独发生在设备上(这意味着如果另一个设备刚刚打开该应用程序将无济于事)。与使用具有最少实例的 Cloud Run 不同,如果从任何环境中触发,无论环境(网络或移动)如何,下一次调用都会很快。

编辑
我也通过将侦听器更改为简单的 getDoc 调用来测试这一点。同样的行为仍然发生在构建应用程序上。将侦听器替换为:

await firestore()
  .collection('Users')
  .doc(user.uid)
  .get()
      .then(async document => {
        if (document.exists) {
          const data = document.data() as UserInformation;
          if (data) data.id = document.id;
          eventsRetrieved(data);
        }
      });

编辑2
进一步测试,现在第一个 Firestore getDoc 上有 3-15 秒的“冷启动”。此外,在某些情况下,应用程序打开之间的时间仅为 10 分钟,因此不再适用最低 30 分钟的基准测试。我将把 dm 发送给 Firebase 错误报告团队以进一步了解情况。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    由于您使用的是 React Native,我假设快照中的文档由 Firestore SDK 存储在本地缓存中(因为本地缓存默认在本机客户端上启用)。并且由于您使用onSnapshot 侦听器,如果同一侦听器在 30 分钟后仍处于活动状态,它实际上会从服务器重新检索结果。来自 的文档:

    如果启用了离线持久性并且侦听器断开连接超过 30 分钟(例如,如果用户离线),您将被收取读取费用,就像您发出了全新的查询一样。

    这里的措辞略有不同,但鉴于您提到的 30m 标记,我确实希望这是您受到的影响。

    【讨论】:

    • 你好,泡芙,谢谢你的信息。我使用简单的 getDoc 函数测试了相同的 onAuthStateChange 流程。同样的行为仍然存在。在应用程序中进行一些 getDocs 调用很快但初始很慢,是侦听器还是 getDoc。
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 2019-09-09
    • 1970-01-01
    • 2018-09-10
    • 2020-02-27
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多