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