圖片來源: 

LinkedIn

LinkedIn對外發表並部分開源其異常注入測試框架LinkedOut,這個框架可以在不影響會員使用經驗下,透過兩種機制引發分散式系統異常,其中包括錯誤、延遲以及超時3種情況。LinkedIn認為,該框架對內除了可以幫助工程師產出高品質程式碼,對外也能展示其系統的強健性。

LinkedIn網站可靠性資深工程師Logan Rosen提到,他們的工作總是一再的驗證墨菲定律,任何可能發生錯誤的地方都會出錯,對於複雜的分散式堆疊,了解系統可能發生問題的地方,以及知道當用戶遇到這些錯誤時,出現的畫面以及情況是非常重要的工作。在2017年LinkedIn可靠性工程團隊建立了Waterbear專案,透過複製系統故障以及調整框架,以透明簡潔的方式處理錯誤,幫助開發人員維持網站彈性,而請求及失敗注入框架LinkedOut則被開發用來測試錯誤、逾時以及超時3種情況。

對分散式系統注入錯誤有很多種方法,Logan Rosen表示,請求層級(Request Level)是最好的方法,因為使用者透過LinkedIn尋找就業機會,他們不希望在測試時,中斷會員使用服務的過程。而這個受控制的實驗過程需求,正是他們開發LinkedOut的原因,LinkedOut的核心是Rest.li堆疊中的請求篩選器,其中部分已經開源。

LinkedOut現在可以製造出3種類型的服務異常,分別是錯誤、延遲以及逾時。Rest.li框架當請求的資源發生通訊或是資料請求異常時,會引發幾種預設的例外情況,像是能以DisruptException來模擬資源不可用,則該資源便會以RestliResponseException的形式出現,使用者同時也可以設定例外出現的時機。在製造延遲情況方面,使用者可以給予大量延遲請求,篩選器則會依要求延遲往下傳遞請求。想要測試服務逾時的情況,只要為終端在D2 Zookeeper配置裡設定逾時,就能讓篩選器等到超過時間,丟出TimeoutException。

在避免影響會員使用經驗的前提下,LinkedOut現在有兩個主要機制來觸發干擾器(Disruptor),其中一個是使用LiX,而這個本身是LinkedIn上進行A/B測試以及功能限制的框架,LiX可瞄準多個層級引發錯誤,測試範圍可從單一用戶進行個別請求,到下游叢集對一定比例的會員發出範圍請求。這個觸發機制,可以提供工程師設定針對特定流量區段的彈性測試。

第二種觸發機制是最近LinkedIn才加入的,透過調用上下文(Invocation Context,IC)對請求注入失敗,這個IC是LinkedIn專屬的Rest.li框架內部組件,用來傳遞鍵(Key)與值到請求中,並傳播到所有參與處理的服務中。LinkedIn為中斷架構建立新的模式,可以透過IC傳遞來讓該請求立即發生異常。

Logan Rosen表示,在開發功能的過程進行這些測試,能夠確保工程師產出高品質的程式碼,而在產品階段進行這些功能,則能向外部組織提供信心以及系統強健的證據。


Advertisement

更多 iThome相關內容