Show Menu
主题×

Dispatcher 概述

各个 Dispatcher 版本与 AEM 相互独立。如果单击以前版本 AEM 文档中嵌入的 Dispatcher 文档链接,可能会重定向到此页面。
调度程序是Adobe Experience Manager的缓存和/或负载平衡工具,可与企业级Web服务器结合使用。
部署调度程序的过程独立于所选的Web服务器和操作系统平台:
  1. 了解 Dispatcher(此页面)。另请参阅有 关调度程序的常见问题
  2. 根据Web 服务器文档 ,安装支持的Web服务器。
  3. 在 Web 服务器上 安装 Dispatcher 模块 ,并相应地配置 Web 服务器。
  4. 配置 Dispatcher (dispatcher.any 文件)。
  5. 配置 AEM ,以便内容更新后,使缓存失效。
要更好地了解Dispatcher如何与AEM协作,请执行以下操作:
根据需要使用以下信息:
Dispatcher 最常见的用法 ​是缓存来自 AEM 发布实例 ​的响应,从而提高面向外部发布的网站的响应速度和安全性。大部分讨论主要介绍这种情况。
但是,Dispatcher 也可以用于提高​ 创作实例 ​的响应速度,尤其是在有大量用户编辑和更新网站的情况下。有关这种情况的详细信息,请参阅下面的 将 Dispatcher 与作者服务器一起使用

为何使用 Dispatcher 来实施缓存?

发布 Web 有两种基本方法:
  • 静态 Web 服务器 :例如 Apache 或 IIS,非常简单但速度很快。
  • 内容管理服务器 :提供动态、实时、智能的内容,但需要更多的计算时间和其他资源。
Dispatcher 可帮助实现既快速又动态的环境。它在静态 HTML 服务器(比如 Apache)中使用的目的是:
  • 以静态网站的形式尽可能多地存储(“缓存”)站点内容
  • 尽可能少地访问布局引擎。
这意味着:
  • 处理​ 静态内容 ​的速度和容易度与在静态 Web 服务器上的完全相同; 此外,您还可以使用为静态 Web 服务器提供的管理和安全工具
  • 根据需要生成​ 动态内容 ,完全没有必要再减慢系统速度。
Dispatcher 包含根据动态站点内容生成和更新静态 HTML 的机制。您可以详细指定将哪些文档存储为静态文件,哪些文档始终通过动态方式生成。
本节将阐明其中运用的原理。

静态 Web 服务器

静态 Web 服务器(如 Apache 或 IIS),负责向网站的访客提供静态 HTML 文件。静态页面只创建一次,因此针对每个请求都将交付相同的内容。
这个流程非常简单,因此相当高效。如果访客请求一个文件(例如 HTML 页面),通常将直接从内存中获取该文件,在最坏的情况下,也可以从本地驱动器读取该文件。静态 Web 服务器问世已有相当长的一段时间,因此有各种各样用于管理和安全管理的工具,而且它们能够很好地与网络基础结构集成。

内容管理服务器

如果您使用内容管理服务器(如 AEM),则由高级布局引擎处理访客的请求。该引擎从存储库中读取内容,包括样式、格式和访问权限,并将内容转换为根据访客需求和权限定制的文档。
这使您能够创建更丰富的动态内容,从而提高网站的灵活性和功能性。但是,布局引擎需要比静态服务器更大的处理能力,因此,如果许多访客同时使用系统,则此设置的速度可能会减慢。

Dispatcher 如何执行缓存

缓存目录 :对于执行缓存,Dispatcher 模块利用 Web 服务器的功能来提供静态内容。Dispatcher 将缓存文档放在 Web 服务器的文档根目录下。
如果没有配置 HTTP 标头缓存,则 Dispatcher 仅存储页面的 HTML 代码 - 它不会存储 HTTP 标头。如果您在网站内使用不同的编码,这可能是个问题,因为这些编码可能会丢失。要启用 HTTP 标头缓存,请参阅 配置 Dispatcher 缓存。
将 Web 服务器的文档根目录放置在网络连接存储 (NAS) 上,会导致性能下降。此外,如果在多个 Web 服务器之间共享位于 NAS 上的文档根目录,则执行复制操作时可能会出现间歇性锁定。
Dispatcher 使用与请求的 URL 相同的结构存储缓存文档。
文件名长度可能存在操作系统级别的限制;例如,您的 URL 中带有许多选择器。

缓存方法

Dispatcher 有两种主要方法可用于在对网站进行更改后更新缓存内容。
  • 内容更新 ​可删除已更改的页面以及与其直接关联的文件。
  • 自动失效 ​可在更新后自动使可能已过期的这部分缓存失效。也就是说,它可以有效地将相关页面标记为已过期,而不会删除任何内容。

内容更新

在内容更新中,有一个或多个 AEM 文档发生了变更。AEM 向 Dispatcher 发送联合请求,以相应地更新缓存:
  1. 它从缓存中删除修改过的文件。
  2. 它从缓存中删除以相同句柄开头的所有文件。例如,如果更新了 /en/index.html 文件,则以 /en/index. 开头的所有文件都会被删除。这种机制允许您设计有效的缓存站点,尤其是对于图片导航。
  3. 它会处理​ ​所谓的 statfile**;这会更新 statfile 的时间戳记,指出最后一次更改日期。
应注意以下几点:
  • 内容更新通常与创作系统结合使用,后者“知道”必须替换哪些内容。
  • 会删除受内容更新影响的文件,但不会立即替换。下次再请求此类文件时,Dispatcher 将从 AEM 实例获取新文件,并将其放置在缓存中,从而覆盖旧内容。
  • 通常情况下,自动生成的图片(包含来自页面的文本)将存储在以相同句柄开头的图片文件中 - 从而确保存在关联以便于删除。例如,您可以将 mypage.html 页面的标题文本作为 mypage.titlePicture.gif 图片存储在相同的文件夹中。这样每次更新页面后就会自动从缓存中删除图片,您就可以确保图片始终反映页面的最新版本。
  • 您可能有多个 statfile,例如每个语言文件夹一个。如果页面已更新,AEM 将查找包含 statfile 的下一个父文件夹,然后处理​**​该文件。

自动失效

自动失效可自动使部分缓存失效 - 不会实际删除任何文件。在每次内容更新时,都会处理所谓的 statfile,因此其时间戳记可以反映最新的内容更新日期。
Dispatcher 有一个遵循自动失效机制的文件列表。当请求该列表中的文档时,Dispatcher 会将缓存文档的日期与 statfile 的时间戳记进行比较:
  • 如果缓存文档的日期较新,则 Dispatcher 将返回缓存文档。
  • 如果日期较旧,则 Dispatcher 将从 AEM 实例中检索最新版本。
同样,应当注意这几点:
  • 当内部关系比较复杂(例如 HTML 页面)时,通常使用自动失效。这些页面包含链接和导航条目,因此通常在内容更新后必须进行更新。如果您有自动生成的 PDF 或图片文件,则也可以选择对这些文件使用自动失效方法。
  • 除了处理 statfile,自动失效不需要 Dispatcher 在更新时执行任何操作。但是,处理 statfile 会自动使缓存内容过时,从而不会将其从缓存中实际删除。

Dispatcher 如何返回文档

确定文档是否实施了缓存

您可以 定义配置文件中Dispatcher缓存的文档 。 Dispatcher 根据可缓存文档列表检查请求。如果文档不在此列表中,则 Dispatcher 从 AEM 实例中请求该文档。
在以下情况下,Dispatcher 始终 ​直接从 AEM 实例请求文档:
  • 请求 URI 包含问号“?”。这通常表示无需缓存的动态页面,例如搜索结果。
  • 缺失文件扩展名。Web 服务器需要扩展名来确定文档类型(比如 MIME 类型)。
  • 设置了身份验证标头(此项可进行配置)
GET 或 HEAD(针对 HTTP 标头)方法可由 Dispatcher 缓存。有关响应头缓存的其他信息,请参 阅缓存HTTP响应头

确定文档是否已缓存

Dispatcher 将缓存文件存储在 Web 服务器上,当做静态网站的一部分。如果用户请求一个可缓存的文档,则 Dispatcher 检查该文档是否存在于 Web 服务器的文件系统中:
  • 如果文档已缓存,则 Dispatcher 返回该文件。
  • 如果未缓存,则 Dispatcher 从 AEM 实例请求该文档。

确定文档是否为最新状态

为确定文档是否为最新状态,Dispatcher 将执行两个步骤:
  1. 它检查文档是否遵循自动失效机制。如果不遵循,则该文档是最新状态。
  2. 如果该文档配置为自动失效,则 Dispatcher 检查它比最后一次可用更改旧还是新。如果较旧,则 Dispatcher 从 AEM 实例请求当前版本,并替换缓存中的版本。
没有配置为​ 自动失效 ​的文档仍保留在缓存中,直到被实际删除;例如,通过网站上的内容更新。

负载平衡的好处

负载平衡就是在多个 AEM 实例间分发网站的计算负载。
您将获得:
  • 更大的处理能力 在实践中,这意味着 Dispatcher 在多个 AEM 实例之间共享文档请求。由于现在每个实例处理的文档数量减少,您的响应速度将会加快。Dispatcher 保留每个文档类别的内部统计信息,以便能够估计负载并高效分发查询。
  • 更大的故障保护范围 如果 Dispatcher 未收到实例的响应,它将自动将请求中继到另一个实例。因此,如果一个实例变得不可用,唯一的结果就是站点速度减慢,这与计算能力损失成正比。但是,所有服务都将继续。
  • 您还可以在同一个静态 Web 服务器上管理不同的网站。
负载平衡可以有效分布负载,而缓存有助于减少负载。因此,在设置负载平衡之前,请尝试优化缓存并降低整体负载。良好的缓存机制可能会提高负载平衡器的性能,或者弃用不必要的负载平衡。
虽然单个 Dispatcher 通常就能够使可用 Publish 实例的容量饱和,但对于某些极少数的应用程序而言,最好在两个 Dispatcher 实例之间额外实施负载平衡。配置多个 Dispatcher 需慎重考虑,因为额外的 Dispatcher 将增加可用 Publish 实例的负载,而且容易降低大多数应用程序的性能。

Dispatcher 如何执行负载平衡

性能统计数据

Dispatcher 保留有关 AEM 每个实例处理文档的速度的内部统计信息。Dispatcher 将根据这些数据估算哪个实例在响应请求时将提供最快的响应速度,以便它在该实例上预留所需的计算时间。
不同类型请求的平均完成时间可能各不相同,因此 Dispatcher 允许指定文档类别。然后在估计计算时间时考虑这些类别。例如,您可以将 HTML 页面和图像区分开来,因为它们的标准响应时间可能相差很多。
如果您使用复杂的搜索功能,则可以为搜索查询创建新的类别。这有助于 Dispatcher 将搜索查询发送到响应最快的实例。这样可以防止速度较慢的实例在收到多个“成本较高的”搜索查询时发生停滞,而其他实例收到“成本较低的”请求。

个性化的内容(粘性连接)

粘性连接可确保同一个用户的文档全部在 AEM 的同一个实例上撰写。如果您使用个性化的页面和会话数据,这一点很重要。数据存储在该实例上,则同一用户发出的后续请求必须返回到该实例,否则数据就会丢失。
由于粘性连接会限制 Dispatcher 优化请求的能力,因此应仅在需要时使用。您可以指定包含“粘性”文档的文件夹,从而确保该文件夹中每个用户的所有文档都在同一个实例上撰写。
对于使用粘性连接的大多数页面,必须关掉缓存 - 否则无论会话内容是什么,所有用户都将看到相同的页面内容。
对于​ 少数 ​应用程序,可以同时使用粘性连接和缓存;例如,显示将数据写入会话的表单。

使用多个 Dispatcher

在复杂设置中,您可以使用多个 Dispatcher。例如,您可以使用:
  • 一个 Dispatcher 用于在内联网上发布网站
  • 第二个 Dispatcher,通过不同的地址和不同的安全设置,在内联网上发布相同的内容。
在这种情况下,请确保每个请求只通过一个 Dispatcher。一个 Dispatcher 不能处理来自另一个 Dispatcher 的请求。因此,请确保两个 Dispatcher 都能直接访问 AEM 网站。

将 Dispatcher 与 CDN 结合使用

内容交付网络 (CDN)(如 Akamai Edge Delivery 或 Amazon Cloud Front)从距离最终用户较近的站点交付内容。这样,它可以
  • 加快最终用户响应速度
  • 减少服务器的负载
作为 HTTP 基础架构组件,CDN 的工作方式与 Dispatcher 非常相似:当 CDN 节点收到请求时,如果可能(缓存中提供该资源,而且是有效的)的话,它将从其缓存响应该请求。否则,它将连接下一个距离最近的服务器,以检索资源并缓存下来,以备响应后续请求(如果适用)。
“下一个距离最近的服务器”取决于您的具体设置。例如,在 Akamai 设置中,请求可以遵循以下路径:
  • Akamai 边缘节点
  • Akamai Midgres 图层
  • 您的防火墙
  • 您的负载平衡器
  • Dispatcher
  • AEM
在大多数情况下,Dispatcher 就是下一个服务器,它可以从缓存中提供文档,并影响返回到 CDN 服务器的响应标头。

控制 CDN 缓存

有许多种方法可以控制 CDN 从 Dispatcher 中缓存以重新获取资源的时间。
  1. 显式配置 根据 mime 类型、扩展名、请求类型等,配置特定资源在 CDN 缓存中的保留时间。
  2. 到期和缓存控制标头 如果由上游服务器发送,则大多数 CDN 都将采用 Expires: Cache-Control: HTTP 标头。This can be achieved e.g. by using the mod_expires Apache Module.
  3. 手动失效 CDN 允许通过 Web 界面从缓存中删除资源。
  4. 基于 API 的失效 大多数 CDN 还提供允许从缓存中删除资源的 REST 和/或 SOAP API。
在典型的 AEM 设置中,按扩展名和/或路径进行的配置(可通过以上第 1 点和第 2 点实现),使为经常使用但不经常变更的资源(如设计图像和客户端库)设置合理缓存期限成为了可能。在部署新版本时,通常需要手动进行失效操作。
如果将此方法用于缓存受管内容,则意味着仅在配置的缓存期限到期且再次从 Dispatcher 中获取文档后,内容变更才对最终用户可见。
为实现更细粒度的控制,基于 API 的失效允许您在 Dispatcher 缓存失效时使 CDN 的缓存失效。Based on the CDNs API, you can implement your own ContentBuilder and TransportHandler (if the API is not REST-based) and set up a Replication Agent that will use these to invalidate the CDN's cache.

将 Dispatcher 与作者服务器一起使用

if you are using AEM with Touch UI you should not cache author instance content. 如果为创作实例启用了缓存,则需要禁用缓存并删除缓存目录的内容。要禁用缓存,应编辑 author_dispatcher.any 文件并修改 /cache 部分的 /rule 属性,如下所示:
/rules
{
/0000
{ /type "deny" /glob "*"}
}

Dispatcher 可在创作实例之前使用以提高创作性能。要配置创作 Dispatcher,请执行以下操作:
  1. 在 Web 服务器中安装 Dispatcher(这可以是 Apache 或 IIS Web 服务器,请参阅 安装 Dispatcher )。
  2. 您可能希望针对正在工作的 AEM 发布实例测试新安装的 Dispatcher,以确保已实现基准正确安装。
  3. 现在,确保 Dispatcher 能够通过 TCP/IP 连接到您的创作实例。
  4. 将示例的 dispatcher.any 文件替换为随 Dispatcher 下载 提供的 author_dispatcher.any 文件。
  5. 在文本编辑器中打开 author_dispatcher.any ,并进行以下更改:
    1. /renders 部分的 /hostname /port 更改为指向创作实例。
    2. /cache 部分的 /docroot 更改为指向缓存目录。如果您正在将AEM 与触屏UI结合使用 ,请参阅上面的警告。
    3. 保存更改。
  6. 删除您在前面配置的 /cache > /docroot 目录中的所有现有文件。
  7. 重新启动 Web 服务器。
请注意,如果使用提供的 author_dispatcher.any 配置,当您安装影响 /libs /apps 下任何内容的 CQ5 功能包、热修复或应用代码包时,必须删除 Dispatcher 缓存中这些目录下的缓存文件,以确保下次再请求时,能够获取新更新的文件,而不是旧的缓存文件。
如果您使用之前配置的创作 Dispatcher 并启用 Dispatcher 刷新代理 ,请执行以下操作:
  1. 在您的 AEM 创作实例上删除或禁用​ 创作 Dispatcher 的 ​刷新代理。
  2. 按照以上新的指示说明重新执行创作 Dispatcher 配置。