2012-03-27 30 views
3

我計劃使用Azure表來存儲各種與應用程序相關的計數器。我的擔心是計數器從應用程序的許多不同客戶端實例中遞增。在Azure表中遞增計數器

看起來像一個簡單的任務在表面,但看着它更接近它是相當具有挑戰性的。

我希望有人能分享一些智慧,這將有助於使問題更易於管理。

謝謝!

+1

您能否提供更多關於您櫃檯用途的信息? – Aymeric 2012-03-27 21:48:39

+0

http://stackoverflow.com/a/11853335/67824 – 2016-12-03 19:18:33

回答

0

根據計數器數量和更新頻率的不同,Azure表格存儲可能不是最佳選擇。首先,表存儲不提供鎖定或事務支持,也不能提供更新服務器上的值而不先檢索它的能力。所以,你可能會因爲另一個實例在試圖更新同一行時更新該行而導致更新失敗。

如果更新的數量和頻率會頻繁地重試更新令人不快,您可能需要考慮SQL Azure,而不是在服務器端更新原子的位置。 (類似於UPDATE Abc SET Value = Value + 1 WHERE ...。)。

3

史蒂夫馬克思在他的blog和相關的Cloud Cover episode中已經涵蓋了這一點。簡短版本是:

  • 客戶端聯繫web角色。
  • Web角色使用System.Threading.Interlocked功能更新靜態變量。這可以避免服務器上的多個線程嘗試更新相同的號碼。
  • 每個webrole都有一個後臺線程,它在定時的基礎上回寫到計數表中,該表包含作爲其PartitionKey/RowKey實例名稱的一部分的計數表。這避免了兩個實例試圖同時更新相同的號碼。
+0

這將適用於多個Web角色? – Chandermani 2012-03-28 07:19:04

+0

是的,因爲每個角色的每個實例都有唯一的名稱,因此在基礎表中有自己的行。 – knightpfhor 2012-04-07 07:29:30

3

而不是保留一個櫃檯爲什麼你不存儲每行命中一行。彙總數據以瞭解計數器值。

混合方法將繼續整理命中。繼續執行聚合和保存。舊命中數據然後被清除\刪除。