2010-07-23 88 views
0

我们正在研究分布在3个负载平衡Web服务器上的Web应用程序。我们通过NHibernate获取的大量数据存储在System.Web.Caching.Cache中。当我使用3个Web服务器时,如何管理存储在Web服务器上的缓存?

System.Web.Caching.Cache做了很多提高应用程序的响应能力,但也有一些问题,我们并不确切地知道如何解决,如

  1. 当用户请求server1的数据数据缓存在server1上,但是对于下一个请求,负载平衡器可能会将它们指向server2。他们在server1上请求的数据不再可用,server2将不得不再次从数据库请求它。

  2. 如果用户在server1上执行某些操作以使缓存的数据无效,则会在server1上刷新缓存。但是server3的server2 &服务器仍然可以使用原始缓存,所以当用户提交后续请求并将其导向其他服务器时,它们将显示无效数据。

  3. 我们有定期更新数据(例如性能数据)的应用程序。性能数据更新时,我们希望从缓存中清除此数据,以便用户再次请求数据时,会向他们显示最新数据。我们如何让这些应用程序清除3台Web服务器上的缓存?

解决这些问题的最佳方法是什么?

我们是否应该使用SessionState服务器将缓存存储在单独的服务器上,例如我们可以使用HttpContext.Session

有没有办法让我们在其他2台服务器上的缓存上设置Cache Dependency?

我们有可能在实际的数据库表或行上实现缓存依赖关系吗?当这些更改缓存刷新? - 或者我们可以设置一个数据库触发器来刷新缓存吗?

回答

0

您有几种选择:

1)使用分布式缓存(如distcache,速度,或NCACHE)

2)使用一个共享的缓存实例(类似memcached的,例如),其所有的网络服务器都可以使用。

NHibernate有所有这些的二级缓存提供程序,可以找到here

2

是的,多服务器环境暴露了ASP.NET缓存的弱点,因为它只是单服务器。您可能需要考虑使用像AppFabric这样的分布式缓存,这将为您提供一个逻辑缓存,这是所有三个Web服务器的基础。

AppFabric可以与NHibernate一起用作二级缓存 - 请参阅http://sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/(尽管请注意,this question表明当前实现可能不会与AppFabric v1版本保持同步)。