我对StackOverflow比较陌生,不确定它是否适合提问设计问题。网站给我一个提示“你问的问题看起来很主观,很可能会被关闭”。也许应该询问programmers.stackexchange.com。请告诉我。如何平衡Google App Engine的多个* dynamic *后端实例的负载?
无论如何..我正在进行的项目之一是在线调查引擎。这是我在GAE上的第一个大型商业项目。
我需要你的建议,以便如何收集统计数据并有效地将它们记录在DataStore中而不会破坏我的数据。最初的要求是:
- 用户完成调查后,客户端发送对[ID(int)+ PercentHit(double)]列表。此列表显示此用户的答案与参考答复者(由ID标识)的预定义答案的匹配程度。我称他们为“目标ID”。
- 调查的创建者希望查看上个小时,特定时间范围或调查开始时给定ID的总计百分比。
- 一些调查可能有成千上万的目标/参考答复者。
所以我创建的实体
public class HitsStatsDO implements Serializable
{
@Id
transient private Long id;
transient private Long version = (long) 0;
transient private Long startDate;
@Parent transient private Key parent; // fake parent which contains target id
@Transient int targetId;
private double avgPercent;
private long hitCount;
}
但是从每个用户为每个目标写HitsStatsDO将使大量的数据。例如,我对3000个目标进行了调查,一周内有400万人回答,第一天有30万人参与调查。即使我们假设他们均匀地回答了24小时,它也会给我们~1040个写/秒。显然,它达到了Datastore的并发写入限制。
我决定收集一小时的数据,除此之外,这就是为什么avgPercent
和hitCount
在HitsStatsDO
。 GAE实例是无状态的,因此我必须使用dynamic backend instance。
在那里,我有这样的事情:
// Contains stats for one hour
private class Shard
{
ReadWriteLock lock = new ReentrantReadWriteLock();
Map<Integer, HitsStatsDO> map = new HashMap<Integer, HitsStatsDO>(); // Key is target ID
public void saveToDatastore();
public void updateStats(Long startDate, Map<Integer, Double> hits);
}
,并与碎片对当前小时和前一小时(不留在这里长期)
private HashMap<Long, Shard> shards = new HashMap<Long, Shard>(); // Key is HitsStatsDO.startDate
所以每小时一次我映射将前一小时的碎片转储到数据存储。
另外我还有class LifetimeStats
它将Map<Integer, HitsStatsDO>
保留在memcached中,其中map-key是目标ID。
同样在我的backend shutdown hook method我将未完成小时的状态转储到数据存储。
只有一个在这里主要的问题 - 我只有一个后端实例 :)它提出了以下关于这一点我想听听你的意见的问题:在不使用后端
- 我能做到这一点实例?
- 如果一个实例不够,该怎么办?
- 如何在多个动态后端实例之间拆分数据?这很难,因为我不知道我有多少人,因为随着负载的增加Google会创建新的。
- 我知道我可以启动居民后端实例的确切数量。但有多少? 2,5,10?如果我一周没有任何负担,该怎么办?不断运行10个后端实例太昂贵了。
- 在后端实例死机/重新启动时,如何处理来自客户端的数据?
有一点要注意的是我不能更改客户端。目前,JavaScript嵌入到客户的网页中。我可以通过某种方式更改RPC,但在体系结构上,我无法用Google文档格式替换客户端。
非常感谢你的想法。
谢谢您的反馈!不幸的是,我无法彻底改变客户。我应该在原帖中提及它。我更新了它。再次感谢! – expert
文档格式不会扩展到一百万个受访者。 –
“文档表单不会扩展到一百万个受访者” - Google说的是什么?像谷歌博客页面不会扩展到一百万读者?请记住,匿名无法击败亚马逊。会有一百万用户关闭一个谷歌页面吗? –