JVM上容错库的初步比较 - frankel


如果您正在实施微服务,那么您很可能正在调用 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。否则,选择其中任何一个。