鍍金池/ 教程/ 大數(shù)據(jù)/ 健康端點(diǎn)監(jiān)控模式
索引表模式
Sharding 分片模式
外部配置存儲(chǔ)模式
命令和查詢職責(zé)分離(CQRS)模式
靜態(tài)內(nèi)容托管模式
運(yùn)行重構(gòu)模式
計(jì)算資源整合模式
Throttling 節(jié)流模式
斷路器模式
事件獲取模式
實(shí)體化視圖模式
緩存預(yù)留模式
守門員模式
聯(lián)合身份模式
補(bǔ)償交易模式
重試模式
領(lǐng)導(dǎo)人選舉模式
優(yōu)先級隊(duì)列模式
健康端點(diǎn)監(jiān)控模式
消費(fèi)者的競爭模式
基于隊(duì)列的負(fù)載均衡模式
仆人鍵模式
管道和過濾器模式
調(diào)度程序代理管理者模式

健康端點(diǎn)監(jiān)控模式

實(shí)施外部工具可以定期通過暴露終端訪問應(yīng)用程序中的功能檢查。這個(gè)模式可以幫助驗(yàn)證的應(yīng)用和服務(wù)被正確執(zhí)行。

背景和問題

它是很好的做法,并且通常是一個(gè)業(yè)務(wù)需求,并監(jiān)控web應(yīng)用程序,和中間層和共享服務(wù),以確保它們是可用的,并執(zhí)行正確的。然而,它更難以監(jiān)測在云中運(yùn)行比它要監(jiān)控本地服務(wù)的服務(wù)。舉例來說,你不必完全控制主機(jī)環(huán)境,而服務(wù)通常依賴于平臺(tái),供應(yīng)商和其他公司提供其他服務(wù)。

也有一些影響云托管的應(yīng)用,如網(wǎng)絡(luò)延遲,性能和下面的計(jì)算和存儲(chǔ)系統(tǒng)的可用性,以及它們之間的網(wǎng)絡(luò)帶寬的因素很多。由于任何這些因素的服務(wù)可能完全或部分失敗。因此,您必須定期驗(yàn)證服務(wù)正在執(zhí)行正確,以確??捎眯裕@可能是您的服務(wù)級別協(xié)議(SLA)的一部分所要求的水平。

解決方案

通過將請求發(fā)送到應(yīng)用程序的端點(diǎn)實(shí)施健康監(jiān)測。該應(yīng)用程序應(yīng)該執(zhí)行必要的檢查,并返回其狀態(tài)的指示。

一種保健監(jiān)測檢查通常結(jié)合了兩個(gè)因素:檢查(如果有的話)的應(yīng)用程序或服務(wù)響應(yīng)于所述請求發(fā)送到健康驗(yàn)證端點(diǎn)執(zhí)行,并且結(jié)果由工具或框架正在執(zhí)行健康檢查驗(yàn)證的分析。的響應(yīng)代碼表示的應(yīng)用程序的狀態(tài)和任選的任何組件或服務(wù),它使用。的延遲或響應(yīng)時(shí)間檢查由監(jiān)測工具或框架進(jìn)行。圖1示出了該模式的執(zhí)行的概述。

http://wiki.jikexueyuan.com/project/cloud-design-patterns/images/hemm.png" alt="" />

圖1 - 模式概述

附加的檢查,可能如下進(jìn)行:在該應(yīng)用程序的運(yùn)行狀況監(jiān)視代碼包括:

  • 檢查云存儲(chǔ)或可用性和響應(yīng)時(shí)間的數(shù)據(jù)庫。
  • 檢查位于所述應(yīng)用程序內(nèi),或位于其它地方,但應(yīng)用程序使用的其他資源或服務(wù)。

幾個(gè)現(xiàn)有的服務(wù)和工具可用于監(jiān)視 web 應(yīng)用程序通過提交一個(gè)請求到一組可配置的端點(diǎn),并評價(jià)針對一組可配置的規(guī)則的結(jié)果。它相對容易地創(chuàng)建一個(gè)服務(wù)端點(diǎn),其唯一的目的是要在系統(tǒng)上執(zhí)行一些功能測試。

這可以通過監(jiān)控工具來執(zhí)行典型的檢查包括:

  • 驗(yàn)證的響應(yīng)代碼。例如,200 的 HTTP 響應(yīng)(OK)的指示應(yīng)用程序作出反應(yīng)而不會(huì)出現(xiàn)錯(cuò)誤。該監(jiān)控系統(tǒng)也可能會(huì)檢查是否有其他響應(yīng)代碼,給出的結(jié)果更全面的指標(biāo)。
  • 檢查響應(yīng)的內(nèi)容,以檢測錯(cuò)誤,甚至當(dāng)返回 200(OK)的狀態(tài)碼。這可以檢測到影響返回的網(wǎng)頁或服務(wù)響應(yīng)的僅有部分的錯(cuò)誤。例如,檢查一個(gè)頁面的標(biāo)題或?qū)ふ夷硞€(gè)特定的詞組,表示正確的頁面被退回。
  • 測量響應(yīng)時(shí)間,這表明網(wǎng)絡(luò)延遲和應(yīng)用程序把執(zhí)行請求的時(shí)間相結(jié)合。增加的值可以指示一個(gè)新興的問題與該應(yīng)用程序或網(wǎng)絡(luò)。
  • 檢查資源或位于該應(yīng)用程序之外的服務(wù),如由應(yīng)用程序使用,以從全局高速緩存?zhèn)鬟f內(nèi)容的內(nèi)容分發(fā)網(wǎng)絡(luò)。
  • 檢查 SSL 證書過期。
  • 測量用于該應(yīng)用程序的 URL 的 DNS 查詢的響應(yīng)時(shí)間,以便測量的 DNS 延遲和 DNS 故障。
  • 驗(yàn)證返回的 DNS 查詢,以確保正確輸入的URL。這有助于通過在 DNS 服務(wù)器上成功的攻擊,以避免惡意請求的重定向。

它也是有用的,在可能情況下,以內(nèi)部部署和托管的位置運(yùn)行,從這些不同的檢查,以測量和來自不同地方比較的響應(yīng)時(shí)間。理想情況下,你應(yīng)該監(jiān)視那些貼近客戶,以得到每個(gè)位置的性能進(jìn)行精確的視圖位置的應(yīng)用程序。除了提供一個(gè)更為堅(jiān)固的檢查機(jī)制,其結(jié)果可能會(huì)影響部署位置的選擇的應(yīng)用程序,以及是否在一個(gè)以上的數(shù)據(jù)中心部署。

試驗(yàn)還應(yīng)該對所有客戶使用,以確保應(yīng)用程序正常工作的所有顧客的服務(wù)實(shí)例運(yùn)行。例如,如果客戶的存儲(chǔ)空間分布在多個(gè)存儲(chǔ)賬戶,在監(jiān)測過程中,必須檢查所有的這些。

問題和注意事項(xiàng)

在決定如何實(shí)現(xiàn)這個(gè)模式時(shí),請考慮以下幾點(diǎn):

  • 如何驗(yàn)證響應(yīng)。例如,僅僅是一個(gè)200(OK)狀態(tài)碼足以驗(yàn)證應(yīng)用程序是否工作正常?雖然這提供了應(yīng)用程序的可用性的最基本的措施,而且是最小執(zhí)行這個(gè)模式中,它提供了有關(guān)操作,趨勢,并在應(yīng)用中可能即將出現(xiàn)的問題的信息很少。

Note

確保應(yīng)用程序不會(huì)正確地當(dāng)目標(biāo)資源是發(fā)現(xiàn)和處理僅返回200狀態(tài)碼。在某些情況下,使用母版頁來承載目標(biāo)網(wǎng)頁的時(shí)候,例如,服務(wù)器可能會(huì)返回一個(gè) 200 OK 狀態(tài)碼,而不是一個(gè) 404 未找到的代碼,即使沒有找到目標(biāo)內(nèi)容頁面。

  • 端點(diǎn)的數(shù)量,以暴露于一個(gè)應(yīng)用程序。一種方法是將暴露的至少一個(gè)端點(diǎn)的應(yīng)用程序所使用的核心服務(wù),而另一個(gè)用于輔助或低優(yōu)先級的服務(wù),使得不同級別的重要性將被分配給每個(gè)監(jiān)控結(jié)果。也可以考慮暴露多個(gè)端點(diǎn),如為每個(gè)核心服務(wù),以提供額外的監(jiān)控粒度。舉例來說,一個(gè)健康的驗(yàn)證檢查可以檢查數(shù)據(jù)庫,存儲(chǔ)和應(yīng)用程序使用外部地理編碼服務(wù);每個(gè)都需要不同級別的正常運(yùn)行時(shí)間和響應(yīng)時(shí)間。應(yīng)用程序可能仍然是健康的,如果地理編碼服務(wù),或其他一些后臺(tái)任務(wù),是幾分鐘不可用。
  • 是否使用相同的終點(diǎn)監(jiān)測作為用于一般訪問,而是設(shè)計(jì)為健康驗(yàn)證檢查一個(gè)特定的路徑;例如,/健康檢查/{GUID}/對一般接入端點(diǎn)。這允許應(yīng)用程序內(nèi)的某些功能測試由監(jiān)測工具,例如添加新的用戶注冊,登錄,以及將一個(gè)測試的順序被執(zhí)行,同時(shí)也證實(shí),一般接入終端是可用的。
  • 收集在服務(wù)響應(yīng)于監(jiān)控請求,以及如何返回該信息的信息類型。大多數(shù)現(xiàn)有的工具和框架只看該 HTTP 狀態(tài)代碼端點(diǎn)的回報(bào)。要恢復(fù)和驗(yàn)證其他信息,可能需要?jiǎng)?chuàng)建一個(gè)自定義監(jiān)控實(shí)用程序或服務(wù)。
  • 多少信息收集。在檢查過程中進(jìn)行過度處理可以重載應(yīng)用和影響其他用戶,并且所花費(fèi)的時(shí)間可能超過監(jiān)控系統(tǒng)的超時(shí),使得它標(biāo)志著該應(yīng)用程序?yàn)椴豢捎?。大多?shù)的應(yīng)用包括儀表,如錯(cuò)誤處理程序,并且記錄性能和詳細(xì)的錯(cuò)誤信息的性能計(jì)數(shù)器,這可能是足夠的,而不是從一個(gè)健康驗(yàn)證檢查返回的附加信息。
  • 如何配置安全監(jiān)控端點(diǎn)保護(hù)他們免受公眾使用;這可能暴露該應(yīng)用程序的惡意攻擊,風(fēng)險(xiǎn)敏感信息的曝光,還是吸引拒絕服務(wù)(DoS)攻擊。典型地,這應(yīng)該在應(yīng)用程序的配置來完成,以便它可以容易地更新,而無需重新啟動(dòng)該應(yīng)用程序。可以考慮使用以下一種或多種技術(shù):通過要求認(rèn)證?Secure 端點(diǎn)。這可以通過使用在請求報(bào)頭中的身份驗(yàn)證的安全密鑰或通過傳遞憑證與請求來實(shí)現(xiàn),條件是,監(jiān)控服務(wù)或工具支持認(rèn)證。
  • Use 一個(gè)不起眼的或隱藏的端點(diǎn)。例如,暴露在端點(diǎn)上一個(gè)不同的 IP 地址,以所使用的默認(rèn)的應(yīng)用程序的 URL,一個(gè)非標(biāo)準(zhǔn)的 HTTP 端口上配置端點(diǎn),和/或使用復(fù)雜的路徑測試頁。它通??梢灾付ㄔ趹?yīng)用程序配置額外的端點(diǎn)地址和端口,并為這些端點(diǎn)的 DNS 服務(wù)器(如果需要),以避免直接指定 IP 地址添加條目。
  • Expose 上接受一個(gè)參數(shù)的端點(diǎn)的方法,諸如鍵的值或操作模式的值。根據(jù)不同的請求時(shí)收到的代碼可以執(zhí)行特定測試或一組測試,或者返回一個(gè) 404 這個(gè)參數(shù)提供的值(未找到)錯(cuò)誤,如果不能被識別的參數(shù)值。所識別的參數(shù)值可以在該應(yīng)用程序的配置進(jìn)行設(shè)置。

Note1

DoS 攻擊是可能對一個(gè)單獨(dú)的端點(diǎn),它執(zhí)行基本功能測試,而不會(huì)影響應(yīng)用程序的動(dòng)作的影響較小。理想情況下,應(yīng)避免使用測試可能暴露敏感信息。如果你必須返回,可能是對攻擊者有用的信息,考慮如何將保護(hù)端點(diǎn)免受未經(jīng)授權(quán)的訪問數(shù)據(jù)。在這種情況下,僅僅依靠默默無聞是不夠的。還應(yīng)該考慮使用 HTTPS 連接和加密的任何敏感數(shù)據(jù),盡管這會(huì)增加服務(wù)器上的負(fù)載。

  • 如何訪問正在使用認(rèn)證固定的端點(diǎn)。不是所有的工具和框架可被配置為包括與健康驗(yàn)證請求的憑證。例如,微軟的 Azure 內(nèi)置健康驗(yàn)證功能無法提供身份驗(yàn)證憑據(jù)。一些第三方的替代品,可以是 Pingdom 的,Panopta,NewRelic 的,和 Statuscake。
  • 如何確保監(jiān)控代理是否正確地履行。一種方法是,以暴露一個(gè)端點(diǎn)僅返回來自應(yīng)用程序的配置或可被用來測試劑的隨機(jī)值的值。

Note2

還要確保監(jiān)控系統(tǒng)進(jìn)行自身檢查,如自檢和內(nèi)置的測試,以避免它在發(fā)出假陽性結(jié)果。

何時(shí)使用這個(gè)模式

這種模式非常適合于:

  • 監(jiān)控網(wǎng)站和 Web 應(yīng)用程序,以驗(yàn)證可用性。
  • 監(jiān)控網(wǎng)站和 Web 應(yīng)用程序,以檢查其是否工作正常。
  • 監(jiān)控中間層或共享服務(wù)來檢測和隔離故障,可能影響其他應(yīng)用程序。
  • 要在應(yīng)用程序中補(bǔ)充現(xiàn)有的儀器,如性能計(jì)數(shù)器和錯(cuò)誤處理程序。衛(wèi)生檢驗(yàn)檢查并不能取代的日志和審計(jì)中的應(yīng)用程序的需求。儀表能夠提供有價(jià)值的信息為現(xiàn)有的框架,監(jiān)視計(jì)數(shù)器和錯(cuò)誤日志來檢測故障或其他問題。然而,它不能提供的信息,如果該應(yīng)用程序是不可用的。

例子

下面的代碼示例,從 HealthCheckController 類的 HealthEndpointMonitoring.Web 項(xiàng)目采取包括可以下載本指南的樣品,演示露出一個(gè)端點(diǎn)進(jìn)行一系列健康檢查。

該 CoreServices 方法,如下所示,執(zhí)行在應(yīng)用程序中使用的服務(wù)的一系列檢查。如果所有的測試中沒有錯(cuò)誤執(zhí)行,該方法返回一個(gè) 200(OK)狀態(tài)碼。如果有任何的測試引發(fā)了異常,該方法返回一個(gè) 500(內(nèi)部錯(cuò)誤)狀態(tài)碼。當(dāng)發(fā)生錯(cuò)誤時(shí)的方法,可任選地返回附加信息,如果該監(jiān)控工具或框架能夠利用它。

public ActionResult CoreServices()  
{  
  try  
  {  
    // Run a simple check to ensure the database is available.  
    DataStore.Instance.CoreHealthCheck();  

    // Run a simple check on our external service.  
    MyExternalService.Instance.CoreHealthCheck();  
  }  
  catch (Exception ex)  
  {  
    Trace.TraceError("Exception in basic health check: {0}", ex.Message);  

    // This can optionally return different status codes based on the exception.  
    // Optionally it could return more details about the exception.  
    // The additional information could be used by administrators who access the  
    // endpoint with a browser, or using a ping utility that can display the  
    // additional information.  
    return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);  
  }  
  return new HttpStatusCodeResult((int)HttpStatusCode.OK);  
}  

該 ObscurePath 方法顯示了如何讀取應(yīng)用程序配置的路徑,并用它作為測試端點(diǎn)。這個(gè)例子也說明了如何接受一個(gè) ID 作為參數(shù),并用它來檢查有效的請求。

public ActionResult ObscurePath(string id)  
{  
  // The id could be used as a simple way to obscure or hide the endpoint.  
  // The id to match could be retrieved from configuration and, if matched,   
  // perform a specific set of tests and return the result. It not matched it  
  // could return a 404 Not Found status.  

  // The obscure path can be set through configuration in order to hide the endpoint.  
  var hiddenPathKey = CloudConfigurationManager.GetSetting("Test.ObscurePath");  

  // If the value passed does not match that in configuration, return 403 "Not Found".  
  if (!string.Equals(id, hiddenPathKey))  
  {  
    return new HttpStatusCodeResult((int)HttpStatusCode.NotFound);  
  }  

  // Else continue and run the tests...  
  // Return results from the core services test.  
  return this.CoreServices();  
}  

該 TestResponseFromConfig 方法顯示了如何可以公開執(zhí)行一個(gè)指定的配置設(shè)定值檢查的端點(diǎn)。

public ActionResult TestResponseFromConfig()  
{  
  // Health check that returns a response code set in configuration for testing.  
  var returnStatusCodeSetting = CloudConfigurationManager.GetSetting(  
                                                          "Test.ReturnStatusCode");  

  int returnStatusCode;  

  if (!int.TryParse(returnStatusCodeSetting, out returnStatusCode))  
  {  
    returnStatusCode = (int)HttpStatusCode.OK;  
  }  

  return new HttpStatusCodeResult(returnStatusCode);  
}  

監(jiān)控端點(diǎn)在 Azure 中托管的應(yīng)用程序

在Azure應(yīng)用程序監(jiān)控終端的一些選項(xiàng)包括:

  • 使用微軟的Azure,的內(nèi)置功能,如管理服務(wù)或流量管理器。
  • 使用第三方服務(wù)或Microsoft系統(tǒng)中心操作管理器的框架等。
  • 創(chuàng)建一個(gè)自定義的工具,或者在您自己的或托管的服務(wù)器上運(yùn)行的服務(wù)。

注意: 盡管 Azure 提供一個(gè)合理的全面的監(jiān)控選項(xiàng),您可以決定使用額外的服務(wù)和工具,以提供額外的信息。

Azure 管理服務(wù)提供了各地的警報(bào)規(guī)則建立了一個(gè)全面的內(nèi)置監(jiān)控機(jī)制。管理服務(wù)網(wǎng)頁中的 Azure 管理門戶 Alerts 部分,可以配置高達(dá)每認(rèn)購10警報(bào)規(guī)則為您服務(wù)。這些規(guī)則指定一條件和用于服務(wù)諸如 CPU 負(fù)載的閾值,或每秒請求或錯(cuò)誤的數(shù)量,并且該服務(wù)可以自動(dòng)發(fā)送電子郵件通知給你在每個(gè)規(guī)則定義的地址。

您可以監(jiān)視具體費(fèi)用取決于您選擇適合您的應(yīng)用程序的托管機(jī)制的條件下(如網(wǎng)站,云服務(wù),虛擬機(jī),或移動(dòng)服務(wù)),但所有這些,包括創(chuàng)建使用網(wǎng)絡(luò)端點(diǎn)警報(bào)規(guī)則的能力您在為您服務(wù)的設(shè)置指定。此端點(diǎn)應(yīng)該及時(shí)地作出反應(yīng),以使警報(bào)系統(tǒng)可以檢測到該應(yīng)用程序是否正常運(yùn)行。

注意: 有關(guān)創(chuàng)建監(jiān)視警報(bào)的詳細(xì)信息,請參閱 MSDN 上的管理服務(wù)。

如果你的主機(jī)在 Azure 云服務(wù)網(wǎng)絡(luò)和工作角色或虛擬機(jī)應(yīng)用程序時(shí),您可以采取的內(nèi)置服務(wù)在Azure中所謂的流量管理器中的一個(gè)優(yōu)勢。流量管理器是一個(gè)路由和負(fù)載平衡服務(wù),可以將請求分發(fā)到您的云服務(wù)托管的應(yīng)用程序基于一系列的規(guī)則和設(shè)置的具體實(shí)例。

除了請求路由,流量管理坪的 URL,端口和相對你定期指定的路徑來確定其規(guī)則中定義的應(yīng)用程序的實(shí)例是活動(dòng)的,并響應(yīng)請求。如果它檢測到一個(gè)狀態(tài)代碼 200(OK)它標(biāo)志著應(yīng)用程序可用,其他狀態(tài)的代碼會(huì)導(dǎo)致流量管理器來標(biāo)記應(yīng)用程序離線。您可以查看流量管理器控制臺(tái)的狀態(tài)和配置規(guī)則來重新路由請求被響應(yīng)的應(yīng)用程序的其他實(shí)例。

但是,請記住,流量管理器將只等待10秒鐘,以接收來自監(jiān)控URL的響應(yīng)。因此,你應(yīng)該確保你的健康驗(yàn)證碼這個(gè)時(shí)間范圍內(nèi)執(zhí)行,允許網(wǎng)絡(luò)延遲從流量管理器往返于您的應(yīng)用程序,然后再返回。

注意: 有關(guān)使用 Windows 流量管理器來監(jiān)視你的應(yīng)用程序的更多信息,請參閱 MSDN 上微軟 Azure Traffic Manager 的。流量管理器在多個(gè)數(shù)據(jù)中心部署指南進(jìn)行了討論。