【发布时间】: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