Dispatcher快取 — 基本原則

Dispatcher作為快取Http — 負載平衡器

什麼是Dispatcher?為何最初稱為「Dispatcher」?

Dispatcher是

  • 首先也是最重要的一個快取

  • 反向proxy

  • 適用於Apache httpd webserver的模組,將AEM相關功能新增至Apache的多功能性,並與所有其他Apache模組一起順暢運作(例如SSL或甚至SSI包含,我們稍後將看到)

在網路早期,您可能會有幾百位訪客造訪網站。 一個Dispatcher的設定,「已分派」或平衡多個AEM發佈伺服器的請求負載,通常情況下已足夠 — 因此,名稱為「Dispatcher」。 然而,現今此設定不再經常使用。

我們稍後會看到設定Dispatcher和Publish系統的不同方式。 首先,讓我們從一些http快取基本概念開始。

Dispatcher快取的基本功能

Dispatcher快取的基本功能

此處會說明Dispatcher的基本概念。 Dispatcher是簡單的快取反向Proxy,能夠接收和建立HTTP請求。 正常的要求/回應週期如下:

  1. 使用者請求頁面
  2. Dispatcher會檢查是否已擁有該頁面的轉譯版本。 假設這是此頁面的第一個請求,且Dispatcher找不到本機快取復本。
  3. Dispatcher向Publish系統請求頁面
  4. 在Publish系統上,頁面會由JSP或HTL範本轉譯
  5. 頁面會傳回Dispatcher
  6. Dispatcher快取頁面
  7. Dispatcher會將頁面傳回瀏覽器
  8. 如果第二次請求相同頁面,則可直接從Dispatcher快取中提供此頁面,而不需要在Publish執行個體上重新轉譯。 這樣可節省在Publish執行個體上等待使用者和CPU週期的時間。

我們在最後一節討論「頁面」。 但相同的配置也適用於其他資源,例如影像、CSS檔案、PDF下載等。

如何快取資料

Dispatcher模組會運用託管Apache伺服器所提供的功能。 HTML頁面、下載和圖片等資源會儲存為Apache檔案系統中的簡單檔案。 就是這麼簡單。

檔案名稱是由要求的資源URL衍生。 如果您要求檔案/foo/bar.html,則會儲存該檔案,例如在/var/cache/docroot/foo/bar.html下。

原則上,如果所有檔案都已快取,並因而靜態儲存在Dispatcher中,您可以提取Publish系統的外掛程式,而Dispatcher將充當簡單的網頁伺服器。 但這只是為了說明原則。 現實生活更複雜。 您不能快取所有內容,而且快取永遠不會完全「滿」,因為由於轉譯過程的動態性質,資源數量可能是無限的。 靜態檔案系統的模型有助於產生Dispatcher功能的粗略描述。 此外,它有助於說明Dispatcher的限制。

AEM URL結構和檔案系統對映

若要更詳細地瞭解Dispatcher,讓我們重新造訪簡單範例URL的結構。 讓我們看看以下範例,

http://domain.com/path/to/resource/pagename.selectors.html/path/suffix.ext?parameter=value&otherparameter=value#fragment

  • http代表通訊協定

  • domain.com是網域名稱

  • path/to/resource是資源儲存在CRX中以及隨後儲存在Apache伺服器的檔案系統中的路徑

從這裡,AEM檔案系統和Apache檔案系統之間有一點不同。

在AEM中

  • pagename是資源標籤

  • selectors代表Sling中使用的多個選取器,以決定如何呈現資源。 URL可以有任意數目的選取器。 它們以句點分隔。 例如,選取器區段可能類似於「french.mobile.fancy」。 選取器應僅包含字母、數字和破折號。

  • html做為最後一個「選取器」稱為延伸。 在AEM/Sling中,它也部分決定轉譯指令碼。

  • path/suffix.ext是類似路徑的運算式,可以是URL的後置字元。 它可用於AEM指令碼,以進一步控制資源的呈現方式。 我們稍後會提供此零件的完整章節。 目前應該就足夠了,知道您可以將其用作其他引數。 尾碼必須有副檔名。

  • ?parameter=value&otherparameter=value是URL的查詢區段。 它可用來將任意引數傳遞至AEM。 無法快取包含引數的URL,因此引數應限制在絕對必要的情況下。

  • #fragment,URL的片段部分沒有傳遞至AEM,它只會在瀏覽器中使用;在JavaScript架構中為「路由引數」,或跳至頁面上的特定部分。

在Apache (參考以下圖表)中,

  • pagename.selectors.html是快取檔案系統中的檔案名稱。

如果URL有尾碼path/suffix.ext,則

  • pagename.selectors.html已建立為資料夾

  • path pagename.selectors.html資料夾中的資料夾

  • suffix.extpath資料夾中的檔案。 注意:如果尾碼沒有副檔名,則不會快取檔案。

從Dispatcher取得URL後 檔案系統配置

從Dispatcher取得URL後​ 檔案系統配置

基本限制

URL、資源和檔案名稱之間的對應相當簡單明瞭。

不過,您可能會注意到一些陷阱,

  1. URL可能會變得很長。 在本機檔案系統上新增/docroot的「路徑」部分,可能會輕易超過某些檔案系統的限制。 在Windows上的NTFS中執行Dispatcher是一項挑戰。 不過,使用Linux是安全的。

  2. URL可包含特殊字元和變音。 這通常不是Dispatcher的問題。 不過請記住,應用程式的許多位置都會解譯URL。 我們經常會看到應用程式的奇怪行為 — 只是為了找出一段很少使用的(自訂)程式碼未針對特殊字元進行徹底測試。 如果可以的話,您應該避免使用這兩項功能。 如果無法做到,請規劃全面測試。

  3. 在CRX中,資源具有子資源。 例如,一個頁面會有許多子頁面。 這在檔案系統中無法比對,因為檔案系統有檔案或資料夾。

不會快取沒有副檔名的URL

URL的副檔名一律必須為。 不過您可以在AEM中提供沒有副檔名的URL。 這些URL將不會在Dispatcher中快取。

範例

http://domain.com/home.html是​ 可快取

http://domain.com/home是​ 不可快取

當URL包含尾碼時,適用相同的規則。 尾碼必須有擴充功能才能快取。

範例

http://domain.com/home.html/path/suffix.html是​ 可快取

http://domain.com/home.html/path/suffix是​ 不可快取

您可能會想,如果資源部分沒有副檔名,但尾碼有副檔名會發生什麼事? 嗯,在此案例中,URL完全沒有尾碼。 檢視下一個範例:

範例

http://domain.com/home/path/suffix.ext

/home/path/suffix是資源的路徑……因此URL中沒有尾碼。

結論

請一律將副檔名新增至路徑和後置字元。 SEO感知人員有時會主張,這會在搜尋結果中將您排在後面。 但是未快取的頁面速度會非常慢,而且會進一步下降。

衝突的尾碼URL

假設您有兩個有效的URL

http://domain.com/home.html

http://domain.com/home.html/suffix.html

在AEM中絕對有效。 若沒有Dispatcher,您不會在本機開發電腦上看到任何問題。 在UAT或負載測試中,您很可能也不會遇到任何問題。 我們面臨的問題是如此微妙,以至於在大部分測試中都未能通過。 當您處於尖峰時間,而且處理時間有限,可能沒有伺服器存取權,也沒有資源可加以修正時,就會受到嚴重影響。 我們曾經遇到過……

那麼……有什麼問題嗎?

檔案系統中的home.html可以是檔案或資料夾。 並非兩者都與AEM中的相同。

如果您先要求home.html,則會建立為檔案。

home.html/suffix.html的後續請求會傳回有效結果,但由於檔案home.html在檔案系統中「封鎖」該位置,因此無法第二次建立home.html做為資料夾,因此不會快取home.html/suffix.html

檔案系統中的檔案封鎖位置,無法快取子資源

檔案系統中的檔案封鎖位置,無法快取子資源

如果您反其道而行之,請先要求home.html/suffix.html,然後先將suffix.html快取在資料夾/home.html下。 不過,當您後續要求home.html做為資源時,此資料夾會被刪除並取代為檔案home.html

當父系擷取為資源時刪除路徑結構

當父系擷取為資源時刪除路徑結構

因此,快取的結果完全是隨機的,取決於傳入請求的順序。 讓事情變得更棘手的是,您通常有多個排程程式。 而效能、快取命中率和行為可能因Dispatcher而異。 如果您想瞭解網站為什麼沒有回應,您必須確定您所檢視的Dispatcher正確順序有誤。 如果您正在檢視Dispatcher (運氣好的話)有較有利的請求模式,您在嘗試尋找問題時會迷路。