Google App Engine的数据存储中,实体组的吞吐量限制是什么?

8
该文档描述了数据存储中实体组的吞吐量限制,但对限制具体是什么却含糊不清。我的困惑分为两个部分:
1. 限制的是什么?
具体来说,是:
a)写入次数? b)写入数据存储的事务数量? c)无论是读取还是写入数据存储的事务数量?
2. 限制的类型是什么?
具体来说,是:
a)人为强制执行的每秒一次硬性规则? b)经验观测到的最大吞吐量,在实践中可能会基于网络负载等因素而变得更好?

嗨,这不是一个完美和直接的答案,你可能已经看过了。它说明限制来自Megastore层。它还谈到使用聚合来实现每秒高达300次写入。https://cloud.google.com/datastore/docs/articles/fast-and-reliable-ranking-in-datastore/ - Tom
谢谢!是的,我看过这篇文章。我明白将写操作聚合到一个事务中可以提高吞吐量。所以,“受限制的是什么”这个问题的答案可能是2或3。但我还没有找到确切的解决方案来确定到底是哪一个。 - user2771609
3个回答

4

本身没有吞吐量限制,但为了保证事务的原子性,更新必须进行序列化并按顺序逐个应用。因此,如果您进行足够的更新,事情就会开始失败/超时。这称为数据存储争用

单个实体或实体组更新过快时将发生数据存储争用。数据存储器将排队并发请求以等待它们的轮到。在超时期限内等待在队列中的请求将抛出并发异常。如果您希望每秒更新单个实体或写入实体组多次,则最好在部署应用程序之前重新设计,以避免可能的争用。

简单回答您的问题,它具体指的是每个实体组的写入次数(约5次/秒),这只是一个经验法则,您可能会有不同的结果。

有些人报告根本没有争用,而其他人则难以获得每秒更新超过1次的问题。可以想象,这取决于操作的复杂性以及执行期间涉及的所有计算机的负载。


但这不能是“写入”的数量。从数据存储争用的角度来推理,它似乎必须是“事务”的数量(因此在一个事务中进行多个写入应该没问题)。但数据存储的工作方式似乎很复杂,我不想相信自己对它的理解。那么,仅从数据存储中读取的事务是否会以某种方式影响速率?这么多问题,太模糊了。 - user2771609
嗯...有些东西你可能不理解,但我无法告诉你呵呵。读取操作不受此影响,在事务处理时,您可以确保获得数据的一致表示(而不是部分更新)。这仅影响对实体组执行的更新,您可以有许多短事务或少数长事务,重要的是实体组能够“释放锁”的速度。尝试考虑如何实现它,很明显为什么会出现这些“限制”。 - Jaime Gómez
你对每秒写入次数的理解是错误的。以下是 Google I/O 演讲中的直接引用(https://www.youtube.com/watch?v=xO015C3R6dw#t=6m01s):“如果您使用批处理或事务,则所有这些都计为单个写入,因此,如果您将写入扇出并以批处理方式执行它们,则可以获得高每秒实体吞吐量。”我认为你对数据存储工作原理的看法过于简单了。你有没有阅读过他们建立在 Megastore 上的论文(http://research.google.com/pubs/pub36971.html)? - user2771609
吞吐量的限制源于分布式数据中心之间协调的开销,而不是交易大小。 - user2771609
你说得没错,我可能过于简单化了。我们甚至还没有涉及到实体组大小和表格,此时我建议你去阅读它是如何实现的,以便更好地理解。但如果你已经阅读过了,那你就知道 :) - Jaime Gómez

0
限制:
  • 每秒钟向实体组写入次数
  • 跨实体组事务(XG 交易)中的实体组数量

每个实体组每秒最多只能进行一次写操作(每秒钟向实体组写入次数限制为 1)。这是一个记录在文档中的限制,实际上似乎是一个“软”限制,也就是说可能会超过该限制,但不保证允许。如果在过去的一秒钟内已经对实体进行了写入,则事务将“阻塞”,但 API 也允许短暂性的异常情况发生。显然,您还可能会受到超时的影响。

这并不影响应用程序的总事务数,只与特定的实体组相关。如果需要,您可以设计数据模型的某些部分以避免此限制。

每个 XG 事务最多可以涉及 25 个实体组,这意味着一个事务的上下文中不能包含超过 25 个实体组(读取、写入等操作)。这曾经是 5 的限制,但最近已经增加。

因此,回答你的直接问题:

  1. 在一个非严格的第二时间窗口内,为整个实体组(由根键定义)编写

  2. 人为强制执行每秒一次的软规则


我非常确定你第一个观点是错误的。就像我在对另一个答案的评论中所说的那样--这是来自Google I/O演讲(youtube.com/watch?v=xO015C3R6dw#t=6m01s)的直接引用。如果您使用批处理放置或事务,则所有这些都计为单个写操作,因此,如果您将写入扇出并将它们分批处理,则可以获得高每秒实体吞吐量。 - user2771609
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user2771609
视频(至少我所说的部分)涉及对单个实体组的写入,因此现在让我们暂时不考虑XG问题。他们说,如果将写入(到单个实体组)分组到单个事务中,则就吞吐量限制而言,它只计为一次写入。因此,他们真正想表达的是吞吐量限制在于__事务__而不是__写入__。如果您愿意,可以在一秒钟内向单个实体组写入1000个更改,只要它在一个事务中。 - user2771609
我认为我们达成了一致,即实体必须属于同一组(具有相同的根),才有希望实现高吞吐量。我们可能不一致的是:为了实现高吞吐量,我们还需要确保将写操作放入单个事务中 - user2771609
严格来说,情况恰好相反。如果每个实体都在单独的实体组中,并且您不将它们包含在事务中,则可以获得最高吞吐量。如果(出于事务原因)您需要将它们一起写入,并且它们无法适合XG限制,则最高吞吐量来自于在单个事务中尽可能多地写入(在数据存储RPC限制内)。如果您关心高吞吐量,应设计实体以不需要事务(即将所有数据分组到一个实体中)并成为其自己的根实体。 - Nick
显示剩余4条评论

-6
如果你问这个问题,那么谷歌数据存储可能不适合你。
谷歌数据存储是一个实验性数据库,API可以随时更改 - 它也是为了零售应用程序、非关键性应用程序而设计的。
当您注册DataStore时,会遇到明确的指示,比如没有向后兼容性等。另一个指示是缺乏清晰的示例,缺乏提供简单API以实现对DataStore访问的包装器 - 网上的示例是一堆复杂的安装和过程来进行简单的查询。
经过多日研究,我的结论是Google DataStore还没有准备好用于商业用途,但一旦完成并在稳定的版本中发布,它看起来很有前途。
当你搜索网络并查看少数谷歌示例时,如果有的话 - 重要的是要注意未提到的内容而不是提到的内容 - 谷歌什么都没有提到..... ;-) 如果您看一下“支持”谷歌数据存储的供应商,他们只是链接到谷歌数据存储网站以获取进一步的信息,并没有提到任何东西,因此您处于一个没有具体信息的环境中....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接