我有一个在 IIS 7 上以 web-garden 模式运行的 asp.net web 应用程序。我想使用单步清除所有工作进程中的运行时缓存项。我可以设置一个数据库键值,但这意味着在每个工作进程上执行的线程,在我的每个负载平衡场景 Web 服务器上将轮询该键值的更改并刷新缓存。这将是一个非常糟糕的机制,因为我每天最多刷新一次缓存项目。此外,由于我有一个 MySql 数据库,因此我无法使用带有 Service Broker 通知的 SqlCacheDependency 来实现推送通知。有什么想法吗?有什么肮脏的解决方法吗?一种可能的解决方法是公开一个 aspx 页面,然后使用托管站点的 ip 和端口而不是域名多次访问该页面 - 例如:http://ip.ip.ip.ip:82/CacheClear。 aspx,以便可以将对该页面的请求发送到该网络服务器中的所有工作进程,并在 Page_Load 上清除缓存项。但这是一个非常肮脏的 hack,并且在所有请求都发送到同一个工作进程的情况下可能不起作用。
问问题
1789 次
1 回答
3
您需要设置进程间通信。对于缓存,有两种常用的方法:
- 设置共享缓存(memcached 等)。
- 设置一个消息队列(例如 ms-mqueue 或 rabbitMq)并使用它将状态传播到本地缓存。
共享缓存是最终的解决方案,因为它意味着整个缓存是分布式的,但它也是最复杂的:需要设置它,以便缓存负载在节点之间正确分布,并确保它不会成为瓶颈。
第二个选项需要您编写更多代码,但如果您不想共享缓存内容(如您的情况),则更容易。最简单的是设置侦听器线程或任务来处理缓存清除或单个条目失效消息。如果没有消息,该线程将处于休眠状态,因此对性能的影响很小。您还可以通过将消息作为通常的 iis 请求管道的一部分来处理来放弃侦听器线程。即设置一个过滤器/模块来检查队列中的消息并在处理请求之前对其进行处理;但在性能方面,第一个选择(稍微)更好。
于 2013-04-11T23:02:35.063 回答