3

我们有一个网站,其中有大量缓存对象存储在 App_Code 中的静态变量中。每当我们将 App_Code 更改推送到生产网络服务器时,它都会回收 IIS 池并刷新缓存。但是,当我们将更改推送到 .aspx 和 .aspx.cs 文件时,它不会刷新缓存。

我需要有一堆每天会更新几次的类,以便能够在 App_Code 中引用。我想要我的 App_Code 的一部分,我可以每天更新几次而无需循环 IIS 和刷新我的缓存,或者能够从 App_Code 中引用 App_Code 之外的类。

有适合我的问题的解决方案吗?

4

2 回答 2

4

我相信对 App_Code 或 /bin/ 的更新总是会回收您的应用程序池。如果您说您有一个部署方案,其中 .aspx.cs 文件更新不会回收您的应用程序池,并且如果您能够引用页面类型本身,也许您可​​以将您的代码移动到 .aspx 中。 cs 文件,以防止发生回收。不过,这可能是一个丑陋的选择。

一个建议是修改您的设计以减少每天所需的源代码更新次数。也许使用 XML 或数据库存储,并将您的应用程序设计得更通用一些,并且不太容易发生二进制更新。

或者也许将您的应用程序划分为几个较小的虚拟应用程序。执行此操作的工作量可能会更高,但在这种情况下,如果您的应用程序更加分区,则您不必在每次部署时都回收整个应用程序。您只需回收受部署影响的模块。

另一个建议可能是设置集群服务器架构。安排部署以应用于一个集群节点,在计划更新发生时仅保持另一个节点处于活动状态,然后在第一个节点更新完成后将更新推出到第二个节点,应用程序池回收。

如果可行,另一个建议是将您的部署时间更改为更少的非高峰时间。

频繁更新是因为发生了很多开发变化吗?

于 2011-01-25T19:58:20.993 回答
2

另一个角度是使用分布式缓存解决方案而不是 HttpRuntime 缓存。

HttpRuntime 缓存有两个主要缺点:

1)当您的应用程序域回收时,它会被刷新。无论如何,这默认情况下每 29 小时执行一次,即使您不修改 App_Code。

2) 它被本地化为单个 Web 服务器。因此,如果您的 Web 服务器需要扩展到更大的 Web 场,您的缓存将变得越来越无效,因为缓存条目不会在所有 Web 服务器之间同步。

分布式缓存解决方案通过在 Web 层和后端数据源之间创建单独的缓存层来回避这些问题。

示例解决方案:

  • 内存缓存
  • 雷迪斯
  • Oracle 一致性(商业)

当然,这会导致架构更加复杂,并且需要更多的硬件或虚拟机。

于 2011-01-25T22:09:31.670 回答