2

我不确定如何在 BigTable 数据存储中处理这个问题。

想象一下下面的例子(只是为了解释这个概念。这个例子与我的实际数据模型不匹配):

  • 我有一个计数器实体来跟踪我的数据存储中的事务数。假设当前的“计数”是 100。
  • 现在两个 web 请求同时读取这个值。
  • 两个 Web 请求都添加了一个新事务
  • 最后两者都更新了计数器(到 101)。

计数器值现在不准确。应该是 102。

关于如何处理这种情况的任何建议?我可以“锁定”计数器以确保在第一个 Web 请求完成之前第二个 Web 请求甚至不会读取它吗?

4

2 回答 2

4

你有几个选择:

  • 根据您的计数器和实体的范围,让 Transaction 实体成为计数器的子实体。然后,您可以插入事务并以事务方式更新计数器。请记住,这会将您的更新速率限制为大约 1-5 QPS。
  • 如果您的计数不必 100% 准确,请单独插入实体并更新计数器(使用单实体事务)。您可以运行常规 cronjob 来重新计算实体的数量,并在错误迫使它不同步时修复计数器。
  • 您可以构建自己的有限分布式事务支持
于 2009-11-26T16:10:19.833 回答
1

除了 Nick 提供的选项之外,您还可以考虑对计数器进行分片。

保留多个计数器,并选择一个进行更新,使得(理想情况下)不可能或(失败)任何两个请求都不会同时选择同一个分片。

然后你有更多的选择。您可以使用分片作为父级进行事务(与单个计数器相比,这减少了争用),尽管您最终会得到具有任意选择父级的新事务实体。或者不要为交易而烦恼,在这种情况下,您可能必须不时修复计数,就像尼克的非交易选项一样。

要读取总计数,您需要将所有分片相加。您不会“同时”阅读它们,但这通常没问题。读取任何计数器,它可能会在您读取它和使用该值之间增加,因此该值实际上只是一个下限。添加分片没有什么不同,只是它可能需要更长的时间。

于 2009-11-26T18:50:29.807 回答