2

我正在运行一个 ASP.NET 网站,服务器既可以读取数据也可以将数据写入数据库,还可以将一些经常访问的数据直接存储在进程内存中作为缓存。当新请求进来时,它们会根据缓存中的数据进行处理,然后再将其写入数据库。

我的托管服务提供商突然决定将他们的服务器置于负载平衡器之下。这意味着我的缓存系统会因为多台服务器随机处理请求而变得非常糟糕。所以我不得不重写我的应用程序的一大块只是为了获得更差的性能,因为我现在必须查询数据库而不是在内存变量检查中快速进行。

首先,我并没有真正看到在 iis 服务器上分配负载的意义,因为根据我的经验,数据库查询通常是瓶颈,现在数据库必须承受更多的冲击。其次,这些事情似乎需要仔细规划,而不仅仅是托管服务提供商为所有客户设置的东西,并期望所有应用程序都适合他们。

这些事情是常见的还是我首先使用进程内存作为缓存是愚蠢的?

我应该开始寻找新的托管服务提供商,还是可以期待网络农场迟早会出现在任何地方?对于我编写的所有未来应用程序并完全避免进程缓存和类似设计,我是否应该保留这样的转换?

(请不要把它变成一场农场与非农场的战斗,我只是想知道它是否如此普遍以至于我在开发时必须牢记这一点。)

4

1 回答 1

1

我绝对比网络/部署专家更像是一名开发人员。因此,虽然我对这些概念有相当好的整体理解(以及一些关于陷阱/限制的第一手经验),但我将依靠其他 SO'ers 来更彻底地审查我的意见。有了这个警告...

首先要注意的是:“网络农场”不同于“网络花园”。Web 农场通常是一系列(物理或虚拟)机器,通常每个机器都有一个唯一的 IP 地址,位于某种负载平衡器后面。大多数负载均衡器都支持会话关联,这意味着给定用户将在第一次访问站点时获得一台随机机器,但在每次后续访问时都会获得同一台机器。因此,您的内存状态管理应该仍然可以正常工作,并且会话亲和性将使给定会话很可能在其整个生命周期内使用相同的应用程序缓存。

我的理解是“网络花园”特定于 IIS,本质上是在同一台机器上并行运行的网络服务器的“多个实例”。它的主要用途与网络场相同(支持更多的并发连接)。但是,据我所知,它不支持任何类型的会话关联。这意味着每个请求最终都可能出现在不同的逻辑应用程序中,因此每个请求都可以使用不同的应用程序缓存。这也意味着您不能使用进程内会话处理 - 您必须转到 ASP 会话状态服务或 SQL 支持的会话配置。当我的客户转移到网络花园模型时,这些都是让我很痛苦的事情。

首先,我并没有真正看到在 iis 服务器上分配负载的意义,因为根据我的经验,数据库查询通常是瓶颈”。IIS 有有限数量的可用工作线程(可配置,但仍然有限),因此只能为有限数量的同时连接提供服务。即使每个请求都是相当快速的操作,在繁忙的网站上,有限的上限也会导致用户体验缓慢。网络农场/花园增加了同时请求的数量,即使它不能完美地解决 CPU 负载的平衡问题。

这些事情是常见的,还是我一开始就愚蠢地使用进程内存作为缓存? ”这不是一个真正的“或”问题。是的,根据我的经验,网络农场非常普遍(网络花园不太常见,但这可能只是我合作过的客户)。无论如何,使用内存缓存并没有错——它们是 ASP.NET 的一个组成部分。当然,有很多方法可以不正确地使用它们并给自己带来问题——但这是一个更大的讨论,并不是真的特定于您的系统是否将部署在网络农场上。

在我看来,您应该在设计系统时假设:

  • 他们将不得不在网络农场/花园上运行
  • 您将拥有会话亲和性
  • 您将没有应用程序级缓存关联性

这当然不是分布式部署的详尽指南。但我希望它能让你更接近了解一些农场/花园景观。

于 2011-07-26T16:09:54.637 回答