Google App Engine分片计数器中有多少个分片?

11
我今天了解到Google App Engine中的分片计数器。文章说,您应该预计每个实体在数据存储中每秒最多可以达到约5个更新/秒。但我认为,除非您有某种方法知道每秒更新的数量,否则这个解决方案就不会“扩展”。例如,您可以分配10个分片,但是在每秒50次更新时,您将开始出现问题。
那么,您如何知道更新的速度,并将该数字反馈到分片数中呢?
我的猜测是,除了计数器之外,您还可以保留一些最近活动的记录,如果检测到峰值,则可以增加分片数。通常是这样做的吗?如果是这样,为什么示例代码中没有这样做? (最后一个问题可能无法回答。)与在代码中自动执行相比,监视网站活动并随着流量上升更新分片计数是否更常见?
更新:分片过少和阻塞的实际后果是什么?这是否意味着网站变得无响应,或者由于超时而可能丢失计数器更新?
顺便说一句,这个问题讨论了如何实现计数器而不进行分片,但其中一个答案暗示即使是memcache在流量高时也需要进行分片。因此,分片分配和调整问题似乎很重要。

很有趣的是,看看memcache方法在没有分片的情况下可以处理多少次更新每秒。 (目前我似乎找不到关于像这样更新给定memcache键的速度有多快的任何数字。) - David Underhill
我只是在学习这个,但是memcache不可靠,因为它随时可能消失。 - brainjam
是的,memcache的值确实可以在任何时候被驱逐。通常这是由于内存压力引起的(尽管也可能发生其他原因,比如memcache服务器崩溃)。这就是为什么基于memcache的解决方案可能会有一点低估的原因之一。 - David Underhill
我认为更相关的问题是,如果选择太多分片,会有什么不利影响?例如,在尝试获取当前总数时性能变慢。 - Peter Recore
@Peter Recore:我的理解是读取速度快,写入速度慢。此外,计数器的值被缓存在memcached中以供检索(但不更新)。 - brainjam
3个回答

4
很明显,手动监控您的网站流行度并根据需要增加碎片数量更为简单。我猜大多数网站采取这种方法。编程实现不仅难以实现,而且听起来会增加无法接受的开销,因为要记录所有最近的活动并尝试分析它以动态调整您使用的碎片数量。
我更喜欢选择更高的碎片数量,这样可以采用更简单的方法。
您所说的碎片过少的实际后果是正确的。更新数据存储实体比可能更频繁,这将导致一些请求花费很长时间(而写入重试)。如果堆积了足够多的请求,那么它们将开始因请求超时而失败。这肯定会导致计数器遗漏。好处是,您的页面将变得非常慢,用户应该会离开,从而减轻数据存储的压力:)。

但是,如果出现超时,我的计数器将会出错。我承认这不会导致任何生命损失,但这让我有点烦恼。这只是我们必须接受的事情之一吗? - brainjam
生活在有一些计数器错误的可能性之下也许并不那么糟糕。只需尝试选择足以容纳您的最大预期峰值流量和一些安全余量的分片数量即可。错过计数越重要,您的安全余量就应该越高。 - David Underhill

3

回答您问题的最后一部分:您的Memcache值不需要分片。单个Memcache服务器可以处理数万个QPS的获取和更新,因此没有一个大型应用程序需要对其Memcache键进行分片。


2
为什么在出现异常时不增加分片数量?
根据这个GAE示例:GAE 示例
try{
  Transaction tx = ds.beginTransaction();
  // increment shard
  tx.commit();           
} catch(DatastoreFailureException e){
   // Datastore is struggling to handle the current load, increase it / double it
   addShards( getShardCount() );

} catch(DatastoreTimeoutException to){
   // Datastore is struggling to handle the current load, increase it / double it 
   addShards( getShardCount() );

} catch (ConcurrentModificationException cm){
   // Datastore is struggling to handle the current load, increase it / double it 
   addShards( getShardCount() );             

}

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