【发布时间】:2009-10-28 23:39:00
【问题描述】:
我运行着一个非常高的流量(每天 1000 万次展示)/使用 .net 构建的高收入网站。核心元数据存储在 SQL 服务器上。我和我的团队有一个独特的缓存策略,包括定期从中间层服务器查询数据库中的新元数据,将数据序列化为文件并将其发送到 Web 节点。 Web 应用程序使用这些文件中的数据(有些实际上是序列化对象)来实例化对象并将其缓存在内存中以用于实时请求。
这种模式的优势在于:
- 允许 Web 节点将所有数据缓存在内存中,并且查询数据库时不会产生任何 IO 开销。
- 如果数据库意外停机或因维护时段停机,Web 服务器将继续运行并产生收益。您甚至可以启动 Web 服务器,而无需从数据库中检索其初始数据,因为它需要的所有数据都在其自己磁盘上的文件中。
- 允许我们完全水平扩展。如果吞吐量受到影响,我们可以添加一个 Web 服务器。
缺点是这种缓存和持久层增加了查询数据库、打包数据和在 Web 服务器上解包的代码的复杂性。任何时候我们的领域模型需要我们添加实体,更多的这种“管道”必须被编码。这种架构已经存在了四年,可能有更好的方法来解决这个问题。
我一直在考虑的一个策略是使用复制将我们的主 sql 服务器数据库复制到安装在每个 Web 服务器上的本地数据库实例。 Web 服务器应用程序将使用普通的 sql/ORM 技术来实例化对象。在这里,我们仍然可以维持主数据库中断,我们不必编写专门的缓存代码,而是可以使用 nHibernate 来处理持久性。
这似乎是一个更优雅的解决方案,想看看其他人的想法,或者其他人是否有任何替代建议。
【问题讨论】:
标签: sql-server architecture caching