我正在寻找一个非常常见的问题,谷歌应用程序引擎平台上的建议,以保持一致的计数器。我有一个任务要加载域的组,然后为每个组创建一个任务,以便在单独的任务中加载其组成员。现在,由于有成千上万的团体和成员,将有太多的任务。我将创建一个任务来获取一页组,在该任务中,我将为每个组创建多个任务以获得其members.Now,为了知道是否加载了所有组,我有逻辑只检查nextPageToken,然后将组加载标志设置为finished。
但是,由于每个组将有单独的任务来加载成员,我需要跟踪所有组成员的任务是否已经完成。现在,我遇到了一个问题,就是访问单个numGroupMembersFinished计数的各种任务都会产生并发问题,并且计数会在某个地方损坏,并且不会返回正确的数据。
发布于 2015-05-01 17:20:56
我的回答是一般性的,因为你的问题没有任何代码或建议的解决方案,因为你没有说你打算把这个计数器放在哪里。
网络上的许多文章都涵盖了这一点。谷歌用于“分片计数器”,用于在O(1)时间内快速计算数据存储实体的半可伸缩性方法。
更重要的是,查看memcache api。它具有一个存储在那里的原子增量/减量计数器的函数。保证不会出现并发问题,但是您仍然需要一些方法来恢复和/或反复检查memcache条目是否被逐出,也许还需要将计数存储在异步设置的实体中,并“按键获取”,以始终获取其最新值。
这仍然不是100%防弹的,因为缓存可能会被逐出,因为您有很多次同时尝试修改它,因此备份数据存储实体可能会遗漏一个"set“。
你需要计算,根据你的预期并行使用,如果这些机会错过一个增量/减少是更大的彗星击中地球。希望你不会用在空中交通控制器上。
发布于 2015-05-01 18:11:16
您可以使用MapReduce或管道API:
https://github.com/GoogleCloudPlatform/appengine-mapreduce https://github.com/GoogleCloudPlatform/appengine-pipelines
允许您将问题分解为较小的、可管理的部分,这样库就可以处理任务之间的信令/阻塞的所有细节,收集结果,并在完成任务后将其返回给您。
Google /O 2010 -使用Google的数据管道:
Google /O 2011:使用App管道API:进行大规模数据分析
Google I/O 2011:应用引擎MapReduce:
https://www.youtube.com/watch?v=EIxelKcyCC0
Google /O 2012 -构建谷歌规模的数据管道:
发布于 2015-05-06 21:44:59
https://stackoverflow.com/questions/29989263
复制相似问题