JVM上容錯庫的初步比較 - frankel

banq發表於2022-01-14

如果您正在實施微服務,那麼您很可能正在呼叫 HTTP 端點。使用 HTTP 呼叫,很多事情都可能出錯。經驗豐富的開發人員對此進行計劃並進行設計,而不僅僅是快樂的道路。一般來說,容錯包括以下特徵:

  • 重試
  • 暫停
  • 斷路器
  • 倒退
  • 速率限制器以避免伺服器端 429 響應
  • Bulkhead:速率限制器限制確定時間範圍內的呼叫數,而 Bulkhead 限制併發呼叫數

有幾個庫在 JVM 上實現了這些功能。在這篇文章中,我們將介紹 Microprofile Fault Tolerance、Failsafe和 Resilience4J。

 

Microprofile Fault Tolerance

Microprofile Fault Tolerance來自 Microprofile 傘形專案。它與其他兩個不同,因為它是一個規範,它依賴於執行時來提供其功能。例如,Open Liberty 就是這樣一種執行時。SmallRye 容錯是另一種。反過來,Quarkus 和 WildFly 等其他元件也嵌入了 SmallRye。

Microprofile為每個特徵定義註釋@Timeout: 、@Retry Policy、@Fallback、@Circuit Breaker和@Bulkhead。它還定義了@Asynchronous.

因為執行時讀取註解,所以應該仔細閱讀文件以瞭解如果設定了多個註解它們是如何互動的。

 

Resilience4J

Resilience4J 基於幾個核心概念:

  • 每個容錯功能一個 JAR,以及用於特定整合的附加 JAR,例如Kotlin
  • 靜態工廠
  • 通過應用於函式的裝飾器模式進行函式組合
  • 與 Java 的功能介面整合,例如, Runnable, Callable,Function等。
  • 異常傳播:可以使用丟擲的功能介面,庫將在呼叫管道中傳播它

 

Failsafe

它的原則類似於 Resilience4J:靜態工廠、函式組合和異常傳播。

。Resilience4J 的 API 要求您首先提供“基礎”函式,然後將其嵌入到任何包裝函式中。但是這樣您酒不能在不同的基本功能之上重用管道,而FailsafeExecutorFailsafe 通過類允許它。

以下是建立管道的方法,即FailsafeExecutor. 請注意,沒有對基本呼叫的引用:

var pipeline = Failsafe.with(                            
    Fallback.of("fallback"),                             
    Timeout.ofDuration(Duration.of(2000, MILLIS)),       
    RetryPolicy.ofDefault()                              
);

Failsafe 還提供了一個流暢的 API。可以將上面的程式碼重寫為:

var pipeline = Failsafe.with(Fallback.of("fallback"))
    .compose(RetryPolicy.ofDefault())
    .compose(Timeout.ofDuration(Duration.of(2000, MILLIS)));

 

結論

所有三個庫都提供或多或少相同的功能。如果您不使用符合 CDI 標準的執行時,可以不用Microprofile Fault Tolerance。

Failsafe 和 Resilience4J 都基於函式組合並且非常相似。如果您需要獨立於基本呼叫定義函式管道,請首選 Failsafe。否則,選擇其中任何一個。

 

相關文章