【发布时间】:2014-03-25 18:16:49
【问题描述】:
请帮帮我..
如何实现网站点击计数器使用APPENGINE java JDO...(一次多个用户点击)
我尝试了一个带有计数变量的简单 jdo 类
和递增函数来增加计数器,但在多个用户的情况下,计数不能按预期工作。
【问题讨论】:
标签: google-app-engine jdo
请帮帮我..
如何实现网站点击计数器使用APPENGINE java JDO...(一次多个用户点击)
我尝试了一个带有计数变量的简单 jdo 类
和递增函数来增加计数器,但在多个用户的情况下,计数不能按预期工作。
【问题讨论】:
标签: google-app-engine jdo
这不是一项简单的任务。当您想要更改 GAE 中的共享数据(计数器)时,有两个因素在起作用:
Datastore 将每个实体(实际上是实体组)的更新速率限制为大约 1 次更新/秒。您需要将计数器划分(分片)为多个实体:请参阅 sharding counters。
您需要以事务方式更改计数器以确保它不会被并行请求覆盖。
事务示例:
PersistenceManager pm = pmf.getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
tx.begin();
// here you should load the counter entity, increase it and then save it
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
【讨论】:
写入更新后的计数值相当慢,因此您可能会遇到竞争条件和最终的一致性问题。根据您的软件,数据存储区可能无法执行超过每秒一次的写入操作。
首先要添加 Sharding Counter 以扩大您的并发计数容量。
第二件事是将计数器更新代码移动到Push Queue,这样网页响应代码就不会被命中计数器代码延迟。
【讨论】: