Azure 角色中快取的 Memcached 包裝函式

重要

Microsoft 建議使用 Azure Redis 快取的所有新開發。 如需選擇 Azure 快取供應專案的目前檔和指引,請參閱 哪一個 Azure 快取供應專案適合我?

Memcache 概觀

Memcache 是一套分散式記憶體內部快取解決方案,用來協助解除資料庫的壓力,加快大規模 Web 應用程式的速度。 網際網路上許多最大的網站都使用 Memcache,而且也以創新的方式和其他技術合併。

Azure 支援 Memcache 通訊協定,能夠讓擁有現有 Memcache 實作的客戶輕鬆移轉至 Azure。 如果應用程式已經使用 Memcache,不需要使用新程式碼取代此程式碼。

例如,使用 Memcache 執行 Azure 快取與只以背景工作角色執行 Memcache 本身相比,前者是更好的選項。 這是因為 Azure 快取提供加值功能,例如正常關機、高可用性、本機快取 (在用戶端填充碼上)、通知 (在用戶端填充碼上)、資料一致性、高可用性 (HA),以及在用戶端幕後輕易擴充和縮小就是其中幾項功能。 例如,具有 Memcache 的 Azure 快取中的伺服器雜湊配置和分割管理,有助於負載平衡及維持資料一致性。

Memcache 通訊協定支援

Azure 快取支援 Memcache 有線通訊協定。 通訊協定有兩種版本,二進位版本和文字版本

Azure 快取除了支援自己的有線通訊協定之外,還支援此通訊協定。 Memcache 用戶端應與 Azure 相容。 Azure 快取幾乎支援其他 Memcache 實作所支援的每一種 API。

因此,使用者若是將 Memcache 應用程式帶進 Azure,將應用程式指向 Azure 的 Memcache 實作,則應可以現有的狀態繼續工作,不必修改其他應用程式。

Memcache 支援兩個不同的開發人員體驗:使用「伺服器閘道」,以及使用「用戶端填充碼」。

Memcache 伺服器閘道

從實作、部署和概念了解的觀點來看,伺服器閘道很簡單,但是也具有重要的警示意義,下面會詳細討論。

當使用伺服器閘道時,伺服器快取叢集會在 Memcache 通訊端上進行接聽。 換言之,它會開啟一個通訊端,並在 Memcache 通訊協定上接聽封包。 沒有轉譯層 (下面會討論)。

若要開啟此功能,在您的快取叢集中開啟另一個內部端點、為其命名,並將其設定為您的 Memcache 連接埠。 送往該連接埠的所有流量都會透過 Memcache 通訊協定接收。

但是,若與使用用戶端填充碼的案例相較,伺服器閘道在效能極敏感的狀況下,效能會降低。 這是因為 Memcache 實作所實作的雜湊與 Azure 快取實作的雜湊不同。 Memcache 實作會將雜湊配置委託給快取用戶端。 在 Azure 中,快取伺服器會產生雜湊。 Azure 快取行為是讓快取伺服器指定雜湊行為。 這可以讓伺服器進行負載平衡、擴大、縮小及確保沒有資料遺失等。

當 Azure 快取某個項目時,會根據項目的金鑰產生雜湊。 Azure 使用雜湊來決定快取叢集中的哪個伺服器要包含快取的項目。 因此,Azure 伺服器閘道必須重新雜湊金鑰,並將項目路由至快取叢集中的目的地伺服器。 此作業涉及額外的網路躍點,因此會降低效能。

Memcache 用戶端填充碼

Memcache 用戶端填充碼會安裝在存取快取的用戶端上。 這通常是擁有應用程式本身的 Azure 角色。 用戶端填充碼支援本機快取。

填充碼是一個轉譯層。 它將 Memcache 用戶端呼叫轉譯為 Azure 快取 API。 填充碼有兩個部分 - Memcache 通訊協定處理常式,以及 Azure 快取用戶端。 填充碼 (轉譯層) 安裝在用戶端本身,從這裡進行對 Azure 快取 API 的 Get 和 Put 呼叫。

當 Memcache 用戶端向 localhost 表明為 Memcache 伺服器時,一開始會由填充碼的本機執行個體處理 Put 作業,而非 Azure 中的快取伺服器。 然後填充碼會決定快取叢集中正確的目的地伺服器,並將 Put 作業重新導向 Azure。

這可免除伺服器閘道案例中的額外網路躍點。 缺點是您必須取得此填充碼,並將其放在您的應用程式中。

使用伺服器閘道與使用用戶端填充碼的比較

快取有兩個拓撲:共置快取和專用快取角色。

如果使用專用快取背景工作角色部署快取叢集,請使用來自快取用戶端的 Memcache 填充碼。 這提供您更好的效能,並避免自動探索程式碼。

當使用共置快取且快取用戶端由同一個角色主控時,請使用 Memcache 伺服器閘道。 使用用戶端填充碼涉及額外的處理和重新導向層,而從同一個角色中存取快取時,這是不需要的。 增加重新導向將增加不必要的額外負荷。

沒有使用伺服器閘道或用戶端填充碼的程式設計模型。 只需要變更組態設定。 同時需要安裝用戶端填充碼。

使用伺服器閘道或用戶端填充碼較偏向部署作業,而非程式設計模型。 身為程式設計者,您還是要呼叫相同的 Get 或 Put API - 只有應用程式稍有不同。 它現在並不是指向原始的快取伺服器,而是指向伺服器閘道或用戶端填充碼。

最後,正在使用的 Memcache 用戶端程式庫並不知道伺服器閘道和用戶端填充碼,因為標準 Memcache 實作使用相同的通訊協定。 快取伺服器是與遵守標準 Memcache 通訊協定的資料封包有關,而非與 Memcache 用戶端實作本身有關。

如何部署 Azure 應用程式的伺服器閘道

  1. 在將要主控快取伺服器的角色上,前往角色內容和 [快取] 索引標籤。

  2. 選取 [啟用快取] 核取方塊。  這會在 csdef、importModule 元素和其他 csdef/cscfg 設定中新增輸入端點。 接下來,部署經驗是在 [端點] 索引標籤上手動新增一個輸入端點,名為 "memcache_default"。

  3. 現在必須將用戶端設定為指向此叢集。 如果以共置快取使用伺服器閘道,或以專用快取使用用戶端填充碼,只需將應用程式指向 “localhost_thisrolename”,不需要自動探索

如何部署 Azure 應用程式的用戶端填充碼

  1. 在有 Memcache 用戶端的角色上,以滑鼠右鍵按一下角色名稱,然後選取 [新增程式庫封裝參考] 以啟動 NuGet 視窗

  2. 搜尋「Azure 快取 Memcache 填充碼」。 安裝此 NuGet 封裝

  3. 封裝會建立啟動工作、新增 memcache_default 的內部端點並將其對應至 11211,以及新增適當的 dataCacheClients 區段至 App.config 和 web.config。這可以在內部端點索引標籤中變更。

  4. 在 App.config 或 Web.config autoDiscovery 元素中提供角色名稱

  5. 現在必須將用戶端設定為「指向」此填充碼。 編輯 memcache 用戶端設定並將伺服器設定為 “localhost”。 也必須設定正確的連接埠號碼。