增加Azure表中的计数器

时间:2012-03-27 20:23:41

标签: azure azure-storage azure-table-storage

我计划使用Azure Tables来存储各种与应用程序相关的计数器。我担心的是计数器会从应用程序的许多不同客户端实例中增加。

看起来似乎是表面上的一项简单任务,但仔细观察它是非常具有挑战性的。

我希望有人可以分享一些有助于使问题更易于管理的智慧。

谢谢!

4 个答案:

答案 0 :(得分:3)

史蒂夫马克思在他的blog和相关的Cloud Cover episode中已经很好地涵盖了这一点。简短版本是:

  • 客户联系网络角色。
  • Web角色使用System.Threading.Interlocked功能更新静态变量。这可以避免服务器上的多个线程尝试更新相同的号码。
  • 每个webrole都有一个后台线程,该后台线程在定时的基础上写回计数表,该表包括作为其PartitionKey / RowKey实例名称的一部分。这样可以避免两个实例同时尝试更新相同的数字。

答案 1 :(得分:3)

为什么不为每次点击存储一行,而不是保留计数器。汇总数据以了解计数器值。

混合方法将保持整理命中率。继续执行聚合和保存。然后清除旧的命中数据\删除。

答案 2 :(得分:3)

使用Redis缓存介绍Redis可用于此任务,而redis具有原子增量(http://redis.io/commands/INCR)。

答案 3 :(得分:0)

根据计数器的数量和更新频率,Azure表存储可能不是最好的方法。例如,表存储不提供锁定或事务支持,也不提供在没有首先检索它的情况下更新服务器上的值的能力。因此,您可能最终会遇到更新失败的情况,因为当您尝试更新同一行时,另一个实例更新了该行。

如果更新的数量和频率使得频繁重试更新变得不合适,您可能需要考虑SQL Azure,而不是在服务器端可以使更新成为原子的。 (比如UPDATE Abc SET Value = Value + 1 WHERE ...。)。