超时引发的牛角尖一(hystrix概述)

今天本来想继续写一下Spring事务的,但又觉得要说的很多,怕在这么短的时间里无法表述清楚,所以还是等等吧!下面我想先整理一下最近一直关注的,并且参与的项目中有使用到的熔断框架——Hystrix。

Hystrix概述

Hystrix 是 Netflix 公司开源的一款针对分布式系统服务之间调用的容错库,它主要用于解决分布式系统中的服务雪崩问题,通过实现服务降级、服务熔断、依赖隔离、以及提供近乎实时的监控等功能来提高系统的稳定性和可用性。具体功能包括:

  1. 服务降级

当系统负载过高或依赖服务故障时,Hystrix 可以启动预定义的服务降级策略,返回一个默认值或者友好提示,而不是等待超时或者抛出异常。

  1. 服务熔断(Circuit Breaker)

类似于电路中的断路器,当某个服务连续失败达到一定阈值时,Hystrix会“熔断”该服务调用,后续请求不再尝试调用故障服务,而是直接进入降级逻辑。在一段时间窗口过后,Hystrix会尝试进行半开状态下的调用来检查服务是否已经恢复,如果调用成功则关闭熔断状态,否则继续保持打开。

  1. 依赖隔离

通过线程池或信号量的方式来对依赖服务进行资源隔离,防止因为某个依赖服务出现问题而导致整体资源耗尽。例如,为每个依赖服务分配独立的线程池,当线程池满时立即拒绝新请求,防止级联失败。

  1. 监控与仪表盘

提供了一套完整的监控指标和Dashboard工具,可以近乎实时地查看Hystrix命令执行的成功率、失败率、超时次数、被拒绝请求数等统计信息,便于运维人员快速了解系统健康状况并作出相应调整。

因此,Hystrix是一个强大的库,它通过对服务调用的封装、控制和监视,增强了分布式系统在面对依赖服务延迟、故障时的韧性,从而降低整个系统因依赖关系复杂而引发的风险。虽然Hystrix在2019年后停止了主要开发,但其设计思想和模式对于构建高可用分布式系统仍然具有指导意义,并且很多后来的开源项目也吸收了类似的设计原则和机制。

Future类

这里想分享一个跟踪源码时看到的类:Future。Future是一种常见的并发编程概念,它代表一个异步计算的结果当你调用一个可能需要较长时间才能完成的方法时,该方法不会立即返回结果,而是返回一个Future对象,这个对象代表将来某个时间点可以获取到的计算结果

在 Java 中,Future接口位于java.util.concurrent包下,它提供了几种关键方法:

  1. get():阻塞方法,直到计算完成并返回结果如果计算尚未完成,则会阻塞线程直到结果可用。此方法可选地接受一个超时参数,超过该时间后如果没有结果则抛出异常
  2. cancel(boolean mayInterruptIfRunning):尝试取消此任务。如果任务已完成、已取消或无法取消,则该请求将被忽略。参数决定是否应该中断正在执行的任务(如果可能)。
  3. isCancelled():判断任务是否已被取消
  4. isDone():判断任务是否已完成,无论正常结束还是通过取消

例如,在Java的ExecutorService中提交一个Callable任务,就会返回一个Future对象:

ExecutorService executor = Executors.newSingleThreadExecutor();

Future future = executor.submit(() -> {

    // 这是一个耗时操作,比如网络请求或大量计算

    Thread.sleep(1000);

    return "Hello, Future!";

});

// 主线程继续执行其他任务...

try {

    String result = future.get();  // 阻塞等待结果

    System.out.println(result);  // 输出:"Hello, Future!"

} catch (InterruptedException | ExecutionException e) {

    e.printStackTrace();

}

executor.shutdown();  // 关闭线程池

在现代Java中,CompletableFuture提供了更丰富的功能和更好的控制能力,它是Future接口的一个功能更强大的实现

你可能感兴趣的:(hystrix,hystrix,java,数据库)