Gremlin釋出面向混沌實驗的應用級故障注入(ALF)平臺
在舊金山舉行的ofollow,noindex" target="_blank">ChaosConf 大會上,Gremlin公司釋出了其在“故障即服務”領域的第二款產品——應用級故障注入(ALFI) 。最初的SaaS產品旨在幫助工程師在基礎設施級建立和執行混沌實驗,在此基礎上,ALFI通過本地語言庫支援實現了應用程式級的故障注入。目前,僅支援Java/JVM平臺,但很快就會加入其他語言庫。
根據Gremlin的文件介紹,“操作者考慮請求 ”,除了希望針對基礎設施層嘗試注入故障外——如重啟一個計算例項,增加網路連線延遲或消耗大量的記憶體——操作者也希望針對目標應用程式請求注入故障,例如,增加延遲或終止請求。
在將ALFI庫作為依賴項整合到應用程式之後,工程師可以使用基於Web的Gremlin UI來執行“攻擊”,針對ALFI依賴項報告的特定應用程式屬性來匹配和限定故障注入的影響。工程師可以建立一個範圍精確的破壞實驗,例如,隻影響特定的客戶ID、位置或裝置型別。
選擇通過ALFI進行故障注入的流量型別(圖片來自 Gremlin的部落格 )
Gremlin團隊聲稱,由於ALFI嵌入到了應用程式中,因此,它可以在任何現有的環境中工作,其中也包括所有的無伺服器平臺,如AWS Lambda、Azure Functions和Google Cloud Functions。Gremlin認為,在使用微服務或函式即服務(FaaS)架構方式構建的系統中,許多事件的發生都是由於上游依賴項的某個地方出現了減速或故障。因此,ALFI可以模擬特定服務、特定RPC呼叫和外部依賴的延遲或全面故障,使工程師可以重現中斷,主動發現未知的故障模式,併為多個元件發生故障的更復雜的場景做好準備。
要使用ALFI,工程師必須將Gremlin語言依賴項整合到應用程式中並重新部署。JVM安裝指南 針對當前支援的安裝過程提供了一個詳盡的步驟(目前只提供了一個Gradle依賴示例,很快就會提供一個Maven示例)。應用程式重新部署後,必須通過環境變數或屬性檔案配置一系列ALFI引數,比如Gremlin團隊識別符號和憑證 。
工程師操作的主要Java類是com.gremlin.GremlinService,該類抽象了向Gremlin SaaS平臺API註冊、查詢和快取實驗以及向Gremlin API報告成功所需要的所有功能。GremlinService類被設計為單例,可以通過依賴注入框架進行管理。文件中提供了將故障注入整合到JavaApache HTTP客戶端 和Amazon DynamoDB NoSQL資料庫客戶端的示例。還可以新增自定義擴充套件 。
ALFI的一個重要概念是,每個應用程式都有一組標識屬性。這組屬性被稱為ApplicationCoordinates,用於確定應用程式何時通過基於Web的UI匹配攻擊請求。gremlin-core依賴包括在AWS Lambda和Amazon EC2上執行的整合。在AWS Lambda中,將預設設定屬性“type=AwsLambda、name和region”。在AWS EC2中,將設定屬性“type=AwsEc2、region、az、instanceId”,例如:
{"type"="AwsLambda", "region"="us-west-1", "name"="event-handler"} 和{"type"="MyServiceType", "region"="us-east-1", "service"="recommendations", "criticality"="2", "userfacing"="true"}。 通過在抽象類GremlinCoordinatesProvider中實現這兩個方法,還可以定義操作者希望針對的應用程式的其他方面或“座標”。要建立自定義ApplicationCoordinates,工程師必須重寫initializeapplicationcoordinate()方法。自動生成的ApplicationCoordinates(如果有的話)作為這個方法的引數提供,這意味著,任何自定義的座標都可以附加到裡面。下面是一個自定義ApplicationCoordinates的示例:
import com.gremlin.ApplicationCoordinates; import com.gremlin.GremlinCoordinatesProvider; public class MyCoordinatesProvider extends GremlinCoordinatesProvider { @Override public ApplicationCoordinates initializeApplicationCoordinates(Optional<ApplicationCoordinates> autoDiscoveredCoordinates) { return autoDiscoveredCoordinates.map(c -> { c.putField("userfacing", "true"); return c; }).orElseGet(() -> new ApplicationCoordinates.Builder() .withType("MyServiceType") .withField("name", "recommendations") .withField("userfacing", "true") .build()); } }
然後,可以使用這組ApplicationCoordinates來匹配攻擊。例如,如果操作者建立了匹配userfacing=true的攻擊,那麼上面示例中列舉的應用程式將包含在攻擊中。目前,操作者可以指定應該受故障注入影響的請求的百分比,為請求新增延遲或在請求執行執行緒上導致一個被丟擲的異常。
在故障注入領域,也有開源的解決方案,例如(現已退役的)Netflix/SimianArmy" rel="nofollow,noindex" target="_blank">Simian Army 和Chaos Toolkit ,但是,這些產品需要自託管。執行混沌實驗確實需要提前準備和設計,最近有一篇長文“ChaosConf問答:混沌工程的好處、挑戰和實踐 ”對這些主題都有涉及。
要了解關於Gremlin ALFI的更多資訊,請檢視ALFI釋出博文 和ALFI幫助頁面 。
檢視英文原文:Gremlin Release Application Level Fault Injection (ALFI) Platform for Targeted Chaos Experiments