出于多种原因,在应用程序代码中缓存数据通常是一个好主意。我们在包括 ColdFusion、.NET 和 PHP 的共享环境中已经这样做了一段时间。但是,由于我们与组织中的许多其他开发团队共享此环境,因此停机时间比我们(或我们的客户)预想的要长得多。
因此,我们的 Web 管理员正在着手实施一个新环境。在这个环境中,他们在当前的开发和生产环境之间添加了一个 QA 级别。此外,为了增加正常运行时间,他们在 QA 和生产级别都建立了集群机器。
出于很多原因,这一切都很棒。我发现一个问题就是缓存。将有两组(或更多,取决于节点数量)缓存。可以想象,这会产生以下潜在问题。节点 A 和 B 上的缓存相同。用户 1 更新数据,因此节点 A 上的缓存也会更新。用户 2 来查询数据,但位于节点 B 上,因此获取的是旧数据。
是否有任何关于如何处理这个问题的最佳实践?
我可以对我的代码进行任何类型的更改吗?
有没有可以实现的服务器设置?
答案1
您没有确切说明缓存了什么或如何缓存,因此我们只能进行一些猜测。
典型的集群缓存解决方案将负责确保集群的所有成员都具有一致的数据视图。例如,memcached是应用程序数据缓存的常见解决方案,一个集群成员的更新将立即被其他集群成员看到。
如果您要缓存生成的网页,解决方案通常是仅缓存不变或具有明确定义的到期时间的数据。通常不会缓存每个请求不同的数据。这可以提高 Web 应用程序的性能,因为对图像、样式表和 javascript 等常见项目的提取可以从缓存中获取,而自定义用户 HTML 则从后端提取。或者,如果用于生成页面的数据已更改,某些解决方案可能会使缓存失效。
答案2
您知道这种集群的具体实现方式吗?例如,如果您通过将一组服务器置于硬件负载平衡器后面来“集群”您的 Web 服务器,则客户端将保持与单个支持服务器的连接,因此不会出现缓存问题。