【发布时间】:2012-02-03 09:12:08
【问题描述】:
我有 3 个 Web 服务器的负载平衡应用程序。我有一个要求,在单击按钮时,我需要同时在所有三个网络服务器上按键删除缓存。例如,有一个名为 currentTemperature 的缓存。因此,当我单击一个按钮时,我只想在所有三个 Web 服务器上删除缓存 [“currentTemperature”]。我不希望在此过程中删除任何其他缓存项。
有什么想法吗?
【问题讨论】:
我有 3 个 Web 服务器的负载平衡应用程序。我有一个要求,在单击按钮时,我需要同时在所有三个网络服务器上按键删除缓存。例如,有一个名为 currentTemperature 的缓存。因此,当我单击一个按钮时,我只想在所有三个 Web 服务器上删除缓存 [“currentTemperature”]。我不希望在此过程中删除任何其他缓存项。
有什么想法吗?
【问题讨论】:
当您运行负载平衡的网络场时,每台服务器都有自己的缓存。一种可能性是实现一种机制,使响应原始“删除缓存”请求的 Web 服务器向其他服务器发出相同的请求。但是,这可能会变得非常复杂且难以管理。每台服务器都需要“了解”场中的其他服务器,才能知道要联系哪些其他服务器。
如果您将某些内容放入配置文件(或数据库)以存储服务器的完整列表(可能通过直接内部 IP 地址)并编写缓存清除代码以自动发现当前服务器,那么相同的代码可以部署到所有服务器。
或者,您可以简单地使用蛮力方法。保留内部 IP 的列表,当 Web 服务器处理某个请求时,让它向所有内部 IP 发送相同的请求。处理请求的代码需要知道它是内部请求还是外部请求,以避免来自每个服务器的请求无限循环。这可以通过查询字符串中的名称/值对来完成,该对表明它是一个内部请求 - 不会包含在来自浏览器的请求中。
这是一个非常理论化的讨论,但听起来对你有用吗?
注意:这假定您的缓存是在每个 Web 服务器上的 IIS 应用程序中完成的,而不是在单独的自定义服务层中完成的。
【讨论】:
无论采用何种机制,都需要了解所有需要清除缓存的服务器。
不是每个服务器都知道所有其他服务器,而是有一个集中的进程(服务/应用程序/任何东西),它将缓存清除请求排队,然后将其发送到场中的每个服务器。
这样您就可以将逻辑放在一个地方,避免可能的无限循环(每个服务器更新其他服务器,更新原始服务器等),并且可以通过最小的更改进行扩展。
Web 服务器不负责管理队列 - 只是将缓存清除事件传递给某个集中式进程。
【讨论】: