高可用架构(10)-Hystrix隔离策略、Command及资源池大小控制(上)

简介: 高可用架构(10)-Hystrix隔离策略、Command及资源池大小控制(上)

1 隔离策略 - ExecutionIsolationStrategy

执行HystrixCommand时使用

1.png

指定HystrixCommand.run()的资源隔离策略。

资源隔离,要解决的最核心的问题,就是将多个依赖服务的调用分别隔离到各自资源池内。避免对某个依赖服务的调用,因为依赖服务的接口调用的延迟或者失败,导致服务所有线程资源全部耗费在该服务的接口调用上。


1.1 THREAD - 线程池隔离

线程池隔离技术,并非指控制类似tomcat web容器的线程。严格意义说,hystrix的线程池隔离技

术,控制tomcat线程的执行。线程池满后,确保tomcat的线程不会因为依赖服务的接口调用延迟或故障,被hang住,fallback , ms。tomcat其他的线程不会卡死,快速返回,然后可以支撑其他的事情。


线程池和信号量做资源隔离、限流、容量的限制,默认的容量都是10。

线程池隔离技术是用自己的线程去执行调用的。

信号量隔离技术,是直接让tomcat的线程去调用依赖服务的。


默认的策略为线程池。


THREAD:在单独的线程上执行HystrixCommand#run方法,使用线程池大小限制并发

基于线程池

HystrixCommandProperties.Setter()
   .withExecutionIsolationStrategy(ExecutionIsolationStrategy.THREAD)

优点

支持排队和超时

支持异步调用

不足

线程调用会产生额外的性能开销。

容易由于创建大量线程而 OOM,所以 sentinel 只支持信号量隔离。


适用场景

适合绝大多数的场景,线程池,对依赖服务的网络请求的调用和访问,超时这种问题。


不受信客户

有限扇出

1.2 SEMAPHORE - 信号量隔离

SEMAPHORE:在调用线程上执行HystrixCommand#run方法,使用信号量许可计数限制


基于信号量

HystrixCommandProperties.Setter()
   .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)

线程池机制,每个command运行在一个线程中,限流是通过线程池的大小来控制的

信号量机制,command是运行在调用线程中,但是通过信号量的容量来进行限流


优点

轻量,无额外开销。


不足

不支持任务排队和主动超时

不支持异步调用

适用场景

适合访问不是对外部依赖的访问,而是对内部比较复杂业务逻辑的访问。

但像这种访问,系统内部代码,其实不涉及任何的网络请求,那么只要做信号量的普通限流即可。

因为不需要去捕获类似超时的问题,算法效率要求不是太高。并发量突然太高,因为这里稍微耗时一些,导致很多线程卡在这里的话,不太好,所以进行一个基本的资源隔离和访问,避免内部复杂的低效率代码,导致大量线程夯死。


受信客户

高扇出(网关)

高频高速调用

使用信号量场景,通常是针对超大并发量,每个服务实例每秒都几百QPS。

此时如果用线程池,线程一般不会太多,可能撑不住高并发。要撑住,可能要耗费大量线程资源,那么就用信号量,来限流保护。


一般用信号量常见于那种基于纯内存服务,而不涉及到任何网络访问请求。


netflix有100+的command运行在40+的线程池中,只有少数command是不运行在线程池中的,就是从纯内存中获取一些元数据,或者是对多个command包装起来的facacde command,是用信号量限流的。

2.png

比如缓存服务,可能会将部分量特别少,访问又特别频繁的一些数据,放在纯内存。

一般我们在获取到商品数据之后,都要去获取商品是属于哪个地理位置,省,市,卖家的

可能在自己的纯内存中,比如就一个Map去获取。对于这种直接访问本地内存的逻辑,比较适合用信号量做一下简单的隔离。

优点在于,不用自己管理线程池,不用担心超时,信号量做隔离的话,性能会相对高。


坑点

3.png

2 command名称 & command组

2.1 command名称

每个command,都可设置自己的名称,同时可以设置一个自己的组。

private static final Setter cachedSetter = 
    Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
        .andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld"));    
public CommandHelloWorld(String name) {
    super(cachedSetter);
    this.name = name;
}

2.2 command group

默认情况下,因为就是通过command group来定义一个线程池,而且还会通过command group聚合一些监控和报警信息。

同一command group中的请求,都会进入同一个线程池中。

目录
相关文章
|
15天前
|
敏捷开发 监控 数据管理
构建高效微服务架构的五大关键策略
【4月更文挑战第20天】在当今软件开发领域,微服务架构已经成为一种流行的设计模式,它允许开发团队以灵活、可扩展的方式构建应用程序。本文将探讨构建高效微服务架构的五大关键策略,包括服务划分、通信机制、数据管理、安全性考虑以及监控与日志。这些策略对于确保系统的可靠性、可维护性和性能至关重要。
|
1月前
|
NoSQL Java API
构建高效的微服务架构:策略与实践
【4月更文挑战第6天】在当今软件开发的世界中,微服务架构已经成为实现系统灵活性、可扩展性及快速迭代的关键。本文将深入探讨如何构建一个高效的微服务系统,包括关键的设计原则、技术选型以及实践中的挑战和解决方案。我们将从微服务的基本概念出发,逐步深入到具体的实施步骤,最后讨论持续集成、监控和故障恢复等运维策略。
|
11天前
|
消息中间件 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【4月更文挑战第25天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。本文深入探讨了如何构建一个高效且可靠的微服务架构,包括关键的设计原则、技术选型以及实践中的挑战和应对策略。通过分析多个成功案例,我们总结了一系列最佳实践,并提出了一套可量化的性能优化方法。文章不仅为开发者提供了具体的技术指导,同时也强调了团队协作和持续学习在微服务转型过程中的重要性。
|
3天前
|
安全 数据管理 持续交付
构建高效微服务架构的五大核心策略
【5月更文挑战第3天】在当前软件开发领域,微服务架构已成为一种流行的设计模式,它通过将应用程序拆分成一组小型、松耦合的服务来提高系统的可维护性和扩展性。本文将详细探讨构建高效微服务架构的五大核心策略,包括服务划分原则、通信机制设计、数据管理、安全性考虑以及持续集成与部署。这些策略不仅有助于确保系统的高可用性和灵活性,同时也支持快速迭代和部署,是实现现代云原生应用的基石。
|
4天前
|
负载均衡 Java API
构建高效微服务架构:API网关与服务熔断策略
【5月更文挑战第2天】 在微服务架构中,确保系统的高可用性与灵活性是至关重要的。本文将深入探讨如何通过实施有效的API网关和设计合理的服务熔断机制来提升分布式系统的鲁棒性。我们将分析API网关的核心职责,包括请求路由、负载均衡、认证授权以及限流控制,并讨论如何利用熔断器模式防止故障传播,维护系统的整体稳定性。文章还将介绍一些实用的技术和工具,如Netflix Zuul、Spring Cloud Gateway以及Hystrix,以帮助开发者构建一个可靠且高效的微服务环境。
|
5天前
|
运维 监控 数据可视化
探索微服务架构下的系统监控策略
【4月更文挑战第30天】 在当今快速迭代和持续部署盛行的软件发展环境中,微服务架构以其灵活性、可扩展性成为众多企业的首选。然而,随着服务的细分与增多,传统的监控手段已不足以应对复杂多变的系统状态。本文将深入探讨在微服务架构中实施有效系统监控的策略,包括指标的选择、数据的收集与处理,以及监控信息的可视化等方面。通过分析现有问题,并提出切实可行的解决方案,旨在帮助开发者构建更健壮、更易于管理的微服务系统。
|
7天前
|
监控 测试技术 持续交付
构建高效微服务架构的五大关键策略
【4月更文挑战第28天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构已成为组织追求敏捷性、可扩展性和技术多样性的重要解决方案。本文将深入探讨构建高效微服务架构的五大关键策略,涵盖从服务划分到持续集成、监控、安全性以及部署实践。这些策略旨在指导开发者和架构师优化其微服务实施,确保系统的稳定性、性能和安全。
|
18天前
|
机器学习/深度学习 运维 Prometheus
探索微服务架构下的系统监控策略
【4月更文挑战第18天】在当今快速迭代和持续部署盛行的软件工程实践中,微服务架构因其灵活性和可扩展性受到企业青睐。然而,随着服务的细粒度拆分和网络通信的增加,传统的监控手段已不再适用。本文将探讨在微服务环境中实施有效系统监控的策略,包括日志聚合、性能指标收集、分布式追踪以及异常检测等关键技术实践,旨在为读者提供构建稳定、可靠且易于维护的微服务系统的参考指南。
20 0
|
27天前
|
存储 负载均衡 API
构建高效微服务架构的五大关键策略
【4月更文挑战第8天】在现代软件开发领域,微服务架构已经成为实现灵活、可扩展和容错系统的主流设计模式。本文将深入探讨构建和维护高效微服务架构的五个核心策略:服务划分原则、API网关应用、服务发现与注册、熔断机制以及持续集成与部署。通过这些策略的实施,开发团队可以优化系统的响应速度、可靠性和伸缩性,同时确保每个服务能够独立更新和扩展,从而适应不断变化的业务需求。
|
1月前
|
消息中间件 安全 API
构建高效微服务架构:策略与实践
【4月更文挑战第1天】在数字化转型的浪潮中,微服务架构已成为企业追求敏捷、可扩展和灵活部署的重要技术手段。本文将深入探讨如何通过合理的设计原则和先进的技术栈,构建一个高效的微服务系统。我们将剖析微服务设计的核心要点,包括服务的划分、通信机制、数据一致性以及安全性问题,并结合案例分析,展示如何在现实世界中应用这些策略以提升系统的可靠性和性能。