在调度程序中处理 AEM 缓存的最佳方法是什么?

What are the best way of handling AEM caching in dispatcher?

我最近遇到需要手动清除调度程序缓存的情况。例如,如果我正在修改任何 Js/css 文件,我将需要手动清除我的调度程序缓存以获取那些修改后的新 Js/css 否则它将为旧版本的代码提供服务。我刚刚听说 ACS 开发了 clientlib 版本,可以帮助我们进行版本控制。我对此有很多疑问。

之前的clientlib版本AEM是怎么管理的? AEM 没有智能管理版本化的客户端库吗? 处理方式是否正确? 我们可以创建一个脚本,在清除那些 JS/css 文件之前备份现有的脚本吗? 我们还有哪些其他选择?

版本化 clientlibs 之前 - 您通常将调度程序失效作为构建和部署管道的一部分。在将包部署到作者和发布实例之后的最后阶段,调度程序失效。这仍然会导致浏览器缓存未被清除的问题(在 clientlib 名称未更改的情况下。)

为了克服这个问题,您可以构建自定义缓存清除技术,在该技术中维护一个为每个版本命名 clientlibs 的方案 - 例如:/etc/designs/homepageclientlib.v1.js/etc/designs/homepageclientlib.<<timestamp>>.js。这只是为了让浏览器触发从服务器重新下载文件。但是现在 CI/CD 和频繁发布,这只是一个开销。 还有一些非优雅的方法可以使用查询参数强制绕过调度程序。事实上,即使现在打开任何 AEM 页面,您也可能会注意到 cq_ck 用于禁用缓存的查询参数。

来自 acs commons 的版本化 clientlibs 现在是必经之路。无忧无虑,配置为 clientlibs 生成唯一的 md5hash,从而不仅强制绕过调度程序缓存,还强制绕过浏览器级缓存。

版本化的 clientlib 是正确的解决方案。但你还需要更多:

  • Versioned Clientlibs 是一种客户端缓存破坏技术。用于清除浏览器缓存。
  • 它不会破坏调度程序缓存。除非手动清除,否则缓存在调度程序中的页面将继续提供服务。
  • Refer here 类似问题。

回答您的问题:

  • 之前的clientlib版本AEM是怎么管理的?正如@Subhash 指出的那样,它是产品部署脚本(Bamboo 或 Jenkins)的一部分,用于在 clientlibs 更改时清除调度程序缓存。
  • AEM 没有智能管理版本化的 clientlibs 吗? - 这与任何 cms 工具相同。缓存策略必须由 http 服务器而非 AEM 负责。此外,当您部署 js 代码更改时,您需要清除调度程序缓存以使页面反映新的 js 更改。
  • 处理方式是否正确?对于客户端破坏——版本化的 clientlib 是 100% 万无一失的技术。对于调度程序缓存清除,您需要不同的方法。
  • 我们可以创建一个脚本,同时在清除那些 JS/css 文件之前备份现有的脚本吗?应该是 Jenkins/Bamboo 作业中定义的 CI 流程的一部分。不是 AEM 的责任。
  • 我们还有哪些其他选择? - 对于调度程序缓存清除,请尝试 dispatcher-flush-rules。您可以配置当 /etc 设计路径发布时,它们应该自动清除整个树,以便后续请求将命中发布者并获得更新的 clientlibs。

推荐:

  • 使用 Versioned Clientlibs + CI 驱动调度程序缓存清除。

由于 clientlibs 由 IT 团队修改并且需要部署,因此使其成为 CI 过程的一部分以清除缓存。调度程序刷新规则可能会有所帮助。但在生产环境中修改 js/css 并点击发布按钮不是用例。生产部署周期应执行此任务。调度程序缓存清除脚本的参考链接:1. Adobe documentation, 2. Jenkins way, 3. Bamboo way

有一个 add-on 用于 Adob​​e AEM 的资源指纹识别(不限于 clientlibs,基本上用于所有静态网站内容),Cache-Control header 管理和 true resource-only 刷新 AEM 调度程序缓存。它还会从调度程序缓存中删除 AEM 创作过程未涵盖的更新资源(例如,当您部署最新代码时)。 https://www.browsercachebooster.com/

提供免费试用版