【问题标题】:Is it a good way to generate static page for dynamic content in a large website and how to manage the static page properly在大型网站中为动态内容生成静态页面的好方法以及如何正确管理静态页面
【发布时间】:2018-11-25 05:36:21
【问题描述】:

我有一个拥有数百万页的网站。页面上的内容存储在数据库中,但数据变化不是很频繁。所以为了提高网站的性能,降低Web应用的部署成本,我想为动态内容生成静态页面,如果内容发生变化,则刷新页面。但是我很关心如何管理这些大量的页面。我应该如何存储这些页面?当web服务器处理很多请求时,会不会导致IO问题?这个问题有没有更好的解决方案?我应该使用清漆来处理这个问题吗?

【问题讨论】:

  • 你可能想看看使用CDN

标签: performance nginx architecture varnish


【解决方案1】:

Varnish 看起来是一个非常好的用例。基本上,您不会静态地生成整个站点,而是增量式地生成,每次新请求的内容清漆尚未缓存时。

编辑以覆盖 cmets:

  • 如果所有 Varnish 节点都已关闭,您将无法获取内容,就像数据库已关闭或您的负载平衡器已关闭一样。例如,只需使用两个 Varnish 负载平衡即可实现高可用性,例如 keepalived。
  • 如果 varnish 重新启动,缓存将被清除,除非您使用 Varnish Plus/Enterprise 和 MSE。如果您不经常重新启动(配置更改不需要重新启动),这可能不是问题,因为数据库仍然有数据可以重新填充缓存。
  • Varnish 有很多选项可以使内容无效:仅清除一个对象、重新验证、禁止以整个子域或子树为目标、xkeys 用于基于标记的无效。

【讨论】:

  • 但是如果 vanish 宕机或者需要重启,缓存的内容会丢失对吧?如果是这样,如何处理这种情况?
  • 还有一个问题,如果我要更新或者删除一些页面,是否可以清除缓存在vanish中的目标内容?
【解决方案2】:

根据描述,您的架构类似于网页 --> 服务 -->数据库。页面是根据数据库中的数据动态生成的。

例如,当您搜索员工详细信息时,服务会访问数据库并获取员工详细信息并呈现在 UI 上。 现在,如果您为每位员工创建内容并存储为网页,则此解决方案将无法扩展。此外,如果数据库中的员工信息发生更改,如果您不重新创建页面,您将获得过时的数据。

我的建议是架构应该有一个缓存服务器,新架构应该像 网页 --> 服务 --> 缓存服务器> 数据库。 服务应该查询数据库,创建一个页面并存储在缓存中。缓存的键应该是页面 URL,值应该是页面内容。现在,当 URL 访问服务时,服务将从缓存中获取页面,而不是进入数据库。如果缓存中没有key,服务会查询数据库并用key和value填充缓存。

"Key是页面的Url。Value是隐藏更新日期的页面内容。"

当数据库中的数据更新时,您可以让后端作业或单独的服务刷新缓存。作业可以将数据库中的更新日期与缓存值中的日期进行比较,如果日期不匹配,则刷新缓存。在后端运行以刷新缓存的作业将在后台运行,不会影响用户或 UI 性能。

【讨论】:

  • 感谢您的建议,我会重新考虑。
猜你喜欢
  • 2012-07-08
  • 2016-10-23
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多