在谷歌应用引擎中分片计数器

时间:2014-11-07 12:21:47

标签: google-app-engine

HI伙计们我是谷歌应用程序引擎的新手,你们可以解释下面的代码,特别是为什么使用计数器Param和声明参数。我没有消息来源和无助。我渴望了解这个概念,帮助我们......

import PMF;
import java.util.List;
import java.util.Random;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;

public class ShardedCounter {
  private String counterName;

  public ShardedCounter(String counterName) {
    this.counterName = counterName;
  }

  public String getCounterName() {
    return counterName;
  }


  public int getCount() {
    int sum = 0;
    PersistenceManager pm = PMF.get().getPersistenceManager();

    try {
      Query shardsQuery =
          pm.newQuery(GeneralCounterShard.class, "counterName == nameParam");
      shardsQuery.declareParameters("String nameParam");

      List<GeneralCounterShard> shards =
          (List<GeneralCounterShard>) shardsQuery.execute(counterName);
      if (shards != null && !shards.isEmpty()) {
        for (GeneralCounterShard current : shards) {
          sum += current.getCount();
        }
      }
    } finally {
      pm.close();
    }

    return sum;
  }

1 个答案:

答案 0 :(得分:0)

不确定您获得此代码的位置,但他们有great article here

分片计数器背后的想法是拥有一个具有高“命中率”的计数器。让我们说你需要一个拥有100万用户的网站,点击图片上的“Awesome”按钮。使用Google App Engine(GAE),您有一个名为Datastore的存储系统,非常适合存储此类信息。缺点是它一次只能由一个人更新。因此,如果5个人在同一时刻喜欢同一张照片,您将获得一个名为“contention”的内容。

为了避免争用,你有一个分片计数器。而不是一个需要更新的计数器,你有很多,然后汇集他们的数字,以获得总计。 (另一个类比),你需要计算多车道高速公路上的车辆数量,而不是一个人试图计算它们所有你计算车道的数量,然后在最后将它们的数字加在一起。

在实践中(取自第一个链接)你有一个名为“ShardedCounter”的Kind。它有很多碎片(或人数统计)。当你需要递增计数器时,你可以调用随机选择其中一个分片的方法'increment'来增加,然后为你添加。基本上拆分所有请求以在所有分片之间“均匀地”递增计数器。从而减少争用的机会。当你需要实际计数时,它会循环遍历所有计数器,将它们相加并返回实际计数。

我希望能有所作为,否则请给我发表评论,我会尽力回答。

我想说明我没有用Java编写分片计数器但是在Python中有很多次