我在 stackoverflow 的帖子(链接 这里)中读到:
使用可预测的(例如顺序的)文档 ID,会增加命中后端基础架构热点的几率。这降低了写操作的可扩展性。
如果有人能更好地解释使用顺序或用户提供的 ID 时可能出现的限制,那就太好了。
我在 stackoverflow 的帖子(链接 这里)中读到:
使用可预测的(例如顺序的)文档 ID,会增加命中后端基础架构热点的几率。这降低了写操作的可扩展性。
如果有人能更好地解释使用顺序或用户提供的 ID 时可能出现的限制,那就太好了。
Cloud Firestore通过将key范围分配给多台机器来进行水平扩展。当单个机器的负载超过特定阈值时,它会将正在服务的范围分裂并分配到2台机器上。
假设您刚开始使用Cloud Firestore写入数据,这意味着一台服务器当前正在处理整个范围。
当您使用随机Id编写新文档时,当我们将范围分裂成2个时,每台机器最终的负载将大致相同。随着负载的增加,我们继续分裂成更多的机器,每台机器都得到大致相同的负载。这样可以实现良好的扩展性。
当您使用连续Id编写新文档时,如果超出了单个机器可以处理的写入速率,系统将尝试将范围分裂为2个。不幸的是,一个部分没有负载,而另一个部分则有全部负载!这并不适合扩展,因为您永远无法让多台机器处理您的写入负载。
在单个机器运行的负载超过最佳处理能力时,我们称之为“热点”。连续的Id意味着我们无法扩展以处理更多负载。顺便说一句,这个概念也适用于索引条目,这就是为什么我们警告连续的索引值(如now 时间戳)。
那么,负载到了多少才算太大?通常情况下,我们说单个机器可以处理500次写入/秒,尽管这将根据许多因素而自然变化,例如您正在编写的文档大小、事务数量等。
考虑到这一点,您会发现较小、更一致的工作负载并不是问题,但如果您想要根据流量进行扩展,则连续的文档id或索引值自然会限制您与数据库中的单台机器保持同步。
App 实例 ID + "_" + 本地 SQLite 行 ID
)代替生成的 ID,结果现在才发现这个问题。 - Actine