【发布时间】:2020-06-14 03:15:44
【问题描述】:
我们如何在不受写入限制影响的情况下实现 post liked count 功能,就像在 Firestore 中的 Instagram 一样?
假设正在构建的社交应用程序非常受欢迎,并且拥有数百万关注者的著名用户发布了帖子。自然,在很短的时间内,许多追随者会喜欢这个帖子。 likes 不是问题,因为它们是顶级集合。并且限制在这里与我们无关,因为每个关注者都在更新他们自己的特定文档。
但是对于like_count 字段,所有这些用户都会尝试同时更新同一个文档。由于限制,这将是有问题的。并且喜欢的计数是错误的。
我了解了“分片”或"Distributed Counter",它基本上将点赞数分配给许多文档,并线性划分限制。然而,这不是我正在寻找的一种解决方案,因为它不能很好地扩展并且需要太多的架构来生成这样一个简单的数字。
这个限制是否意味着像 Instagram、Twitter、Facebook、Snapchat、TikTok 这样的应用程序永远不能使用 Firestore 作为后端?或者有没有一些聪明的策略可以克服这个限制。
【问题讨论】:
-
分布式计数器不能很好地扩展是怎么回事?该解决方案被明确设计为可以很好地扩展,并且是推荐的解决方案。如果您想在 Firestore 中存储可扩展的计数,这基本上是您唯一的选择,除非您想将您的喜好存储在其他地方,这会使事情变得更加复杂。如果你想要一个快捷方式,你可以使用 Firebase 扩展来实现该模式,但它本质上仍然是一样的:firebase.google.com/products/extensions/firestore-counter
-
@DougStevenson 我将如何确定分片数量以确保我不会达到限制?同样对于一些受欢迎的用户来说,分片的数量需要比普通用户多。为每个用户使用相同数量的分片将是矫枉过正。如果我决定使这个分片数量动态化(与追随者数量成正比),我需要注意每个用户的追随者数量。我意识到这不是“决策限制”,而是当前架构的物理限制。你认为你们可以实现一种新的数据类型,专门用于处理多次写入的“计数”情况吗?
-
简单的数学运算 - 决定您的最大类似速率应该是多少,然后创建足够的分片来处理该容量,假设单个文档的最大持续写入是 1/秒。如果您想在 Firestore 中保持“实时”计数,您真的没有更好的选择。如果这真的不适合你,你总是可以使用另一种类型的数据存储来做你想做的事。小心过度思考事情,并且还要意识到任何大规模有效的解决方案都将花费一些时间和金钱。对于必须在云规模上运行的系统,没有简单的解决方法。
-
由于限制,这将是有问题的 - 什么限制?你探索过Real Time Database Transactions 或Firestore Transactions 吗?你有 1,000,000 个用户吗?如果没有,你有多少人,他们中有多少人会同时点击“喜欢”按钮?正如 Doug 所说,不要想太多 - 合理使用。
-
您好,Doug 和 Jay,感谢您的反馈。最后一个问题:将 Realtime DB 中的“计数”与 Firestore 中的其他数据库分开是否有任何缺点?这样我们就不会受到写入限制的影响。
标签: firebase firebase-realtime-database google-cloud-platform google-cloud-firestore google-cloud-functions