2011-03-22 88 views
10

我想爲運行在Windows Azure上的MVC Web應用程序使用全局數據(例如類似於具有新消息的用戶列表的東西)。如何在Azure實例之間共享狀態?

對於一個普通的web應用程序,我可以使用一些像AppDomain.SetData一樣的appdomain存儲或者只是使用靜態變量。我應該爲Azure使用什麼(緩存?blob存儲?隊列?)以及什麼解決方案是最快的?

回答

5

AppFabric的緩存是非常適合在角色(或同一角色的實例)之間共享數據。關於AppFabric Cache的一個有趣的事情是,它不僅僅適用於ASP.NET會話狀態 - 它恰好是位於緩存之上的開箱即用的ASP.NET會話狀態提供程序。

使用緩存幾乎是微不足道的。下面是從一個命令行控制檯應用程序演示片段:

var dataCacheFactory = new DataCacheFactory(); 
DataCache dataCache = dataCacheFactory.GetDefaultCache(); 

Console.Write("Enter a string to cache: "); 
string value = Console.ReadLine(); 

dataCache.Put("key", value); 

string response = (string)dataCache.Get("key"); 
Console.WriteLine("Cached string: " + response); 

使用它作爲會話狀態提供者需要零代碼的變化 - 這一切都通過在app.config/web.config中驅動。

vtortola對於CTP中的AppFabric Cache做了一個很好的說明,但我們應該看到在近期的生產中。

根據查詢的複雜性,表存儲也可以正常工作。聽起來好像您的查詢會相對簡單。

由於AppFabric Cache的定價尚未公佈,因此這可能會影響您的決定,比如表格存儲(運行價格爲0.15美元/ GB)以及相關交易(儘管交易不會對您造成任何顯着影響)成本,每10,000筆交易爲0.01美元)。

EDIT 2012年6月7日定價信息自原來的答案變了:

  • 緩存服務是集生產,並在$ 45開始爲128MB(完整的定價細節here)。
  • 交易現在每100,000筆交易爲0.01美元,存儲起價爲每GB 0.125美元,並基於數量下降(詳情請參閱here)。
  • 現在有一個新的緩存功能可以在您的Web或Worker角色實例中啓用,使用一定比例的可用RAM並且花費ZERO。您也可以創建一個獨立的緩存角色。這兩個都支持全新的SDK v1.7。關於新功能Scott Guthrie blogged(包括Cache)。
+1

Offtopic:AppFabric Cache如何管理併發? – vtortola 2011-03-22 16:01:32

2

我認爲表存儲可以做,但也許AppFabric緩存服務會更適合您的需要,但請記住,最後一個仍然在CTP中。

對於你所說的,我會與表存儲。像在userId分區的表格中檢索最後一條消息並通過DateTime鍵入是非常快的。

乾杯

8

對於 「每用戶數據」,那麼你可以使用ASP.Net Session對象。

要使會話跨多個角色工作,您需要在web.config中指定跨進程會話提供程序。微軟已經提供了幾個例子提供商已經

爲 「全局狀態記憶」,那麼我絕對推薦應用結構緩存或者有一些社區貢獻 - 例如memcached的http://www.davidaiken.com/2011/01/11/windows-azure-memcached-plugin/

如果你的數據的一致性並不重要,那麼你總是可以只使用每個實例緩存在內存中 - 這將是最快的路線,將是最終一致......

+1

上次檢查時,表存儲提供程序不會在未修改最新SDK的情況下構建。我不會推薦它。 – 2011-03-22 12:08:30

+2

遠離表存儲提供程序,它只是一個示例,並存在嚴重的併發問題。在應用結構緩存超出CTP之前,請使用SQL會話提供程序。 http://stackoverflow.com/questions/4937544/asp-net-session-state-provider-in-azure – knightpfhor 2011-03-22 18:37:46

0

AppFabric Cache是​​一個過時的服務......對於新的開發使用Azure Redis緩存。

+0

這是一個答案或評論? – RBT 2016-08-11 09:00:53

+0

這是一個合法的答案,Redis現在是通過Azure去的方式 – Porschiey 2016-11-17 17:41:11

相關問題