2011-03-22 91 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

相关问题