【问题标题】:MemoryCache object and load balancingMemoryCache 对象和负载均衡
【发布时间】:2014-11-15 05:50:00
【问题描述】:

我正在使用 ASP .NET MVC 3 编写一个 Web 应用程序。我想使用 MemoryCache 对象,但我担心它会导致负载平衡 Web 服务器出现问题。当我用谷歌搜索时,看起来这个问题已经在服务器上解决了,即使用 AppFabric。如果一家公司有负载平衡的服务器,是否需要确保他们运行 AppFabric 或类似的东西?或者作为开发人员我有什么可以或应该做的吗?

【问题讨论】:

    标签: asp.net-mvc-3 iis-7.5 appfabric


    【解决方案1】:

    首先,对于 ASP.NET,您应该查看 ASP.NET Cache 而不是 MemoryCache。 MemoryCache 是在 .NET 4.0 中引入的通用缓存 API,用于在非 Web 应用程序中提供等效的 ASP.NET 缓存。

    您说对了,AppFabric 解决了多台服务器拥有自己的缓存数据实例的问题,因为它提供了一个可从您的所有 Web 服务器访问的单一逻辑缓存。在您将其作为解决问题的方法之前,有几点需要考虑:

    • 它不作为 Windows Server 的一部分提供 - 正如您所说,它是 如果你想使用它,你可以将它安装在你的服务器上。什么时候 AppFabric 已发布,有人建议它将作为 下一个版本的 Windows Server 的一部分,但我还没有看到 任何有关 Windows Server 2012 的信息都可以证实这一点。

    • 您需要额外的服务器,或者至少建议您拥有 他们。 Microsoft 对 AppFabric 的建议是您在其上运行它 专用服务器。这意味着虽然 AppFabric 本身是免费的 下载,您可能需要额外的 Windows Server 许可证 费用。说起来……

    • 您可能需要企业版许可证。如果你想使用 AppFabric 的高可用性功能,您只能使用 运行企业版的服务器,这是一个更昂贵的许可证 比标准版。

    • 你可能根本不需要它。其中一些将取决于您的应用程序以及您为什么要使用共享缓存层。如果您担心多台服务器上的缓存可能与数据库(或实际上彼此)不同步,那么明智地使用 SqlCacheDependency 对象可能可以解决问题。

    【讨论】:

    • 我在考虑使用缓存是小附件。附件是要保存的较大对象的一部分。当用户单击保存时,该对象被保存。如果对象还没有保存并且用户上传了一个文件,它需要去某个地方。在更大的对象到达之前将这些数据放入数据库并不是正确的答案。当用户在保存前取消时,应用程序将不得不删除该文件。 IMO 缓存是存储文件的正确位置,因为可以以更有效的方式删除该项目。这个逻辑有缺陷吗?
    【解决方案2】:

    这篇 CodeProject 文章 Implementing Local MemoryCache Invalidation with Redis 建议了一种处理您描述的场景的方法。

    您没有提到您正在使用的负载平衡的风格:“粘性”或“无状态”。到目前为止,最简单的解决方案是使用粘性会话。

    如果您想使用本地内存缓存和无状态负载平衡,您可能会遇到跨服务器失效消息延迟到达的竞争条件。如果您使用 ASP.Net MVC 中常见的 Post-Redirect-Get 模式,这可能会特别成问题。这可以通过使用 cookie 来补充缓存失效广播来克服。我在a blog post here 中详细说明了这一点。

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 2012-01-18
      • 1970-01-01
      • 2020-04-17
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多