分片还是不分片?GAE/java/jdo

3
我目前正在将一些工作从MySQL迁移到Google App Engine/Java。 我正在使用JDO,以及必要时使用较低级别的Java API。
我阅读了有关分片计数器优化指南:http://code.google.com/appengine/articles/sharding_counters.html 我仍在构建我的应用程序基础。 我知道过早地进行优化是万恶之源; 但这个优化明显是为了避免争用而记录的。因此,我很难决定是否应该偏向一方或另一方。
所以,我应该默认使用分片计数器(以及其他可能需要更高频率写入操作的对象),还是应该不分片并根据需要实现?

你打算用这些计数器做什么?希望你不会把它们用于像实体的自动递增 ID 这样的东西。 - cherouvim
谢谢关心,但不用担心。我将会统计页面浏览量和用户行为。 - Dave
听起来不错。也许可以使用memcache,并通过cron每5分钟清除一次数据库? - cherouvim
1
你真的需要自己计算页面浏览量并直接存储到数据存储器中吗?这会导致任何系统的可扩展性问题,而像分析工具这样的工具就是为此而建立的。 - Nick Johnson
我现在更担心的确切情况与投票有关。我不太担心更新速度,而是要避免数据存储争用。我担心如果由于同时投了很多票而导致一个工件被更新,那么争用会导致投票被丢弃。我意识到这可能有些过头,但我没有后见之明 - 所以我采取了“宁愿安全也不要后悔”的方法。 - Dave
对于页面浏览量,我可能会采用@chrouvim建议的memcache方法(我意识到在这方面我不需要100%的准确性)。 还值得注意的是; 这并不是为了专业使用...至少现在还不是;) 我真的只是想学习很多东西,并且我正在偏向于实现决策,以便更深入地了解它。 有点对工作感到焦躁/无聊... - Dave
2个回答

4

这里“premature”的显著意义是“在适当的时间之前”。当限制条件很清楚明确时,为避免这些限制而进行设计并不算过早。

将您的计数器分片。


3
即使进行了有效的分片,维护聚合仍然会给您的应用程序增加一些重要的负载。 如果您需要该聚合,并且无法承受近似值,则使用分片聚合不是过早的优化;没有更好的选择。 如果您实际上不需要计数器,则用于实现它的时间可能更好地用于其他地方。

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