HA 主要组件
- 断路器(Circuit Breaker):
- 用于监控服务调用的失败率,并在达到某个阈值后打开断路器,阻止进一步的调用,以避免对后端服务的过载。
- 提供恢复机制,在一定时间后自动尝试恢复调用。
- 重试(Retry):
- 自动重试失败的操作,支持设置重试次数和延迟。
- 可以与断路器结合使用,增强调用的成功率。
- 限流(Rate Limiter):
- 限制单位时间内的请求次数,防止服务被过载。
- 可以按用户、IP 或其他维度进行限流。
- 隔离器(Bulkhead):
- 通过将服务分割为多个隔离的部分,防止某一部分的故障影响到整个系统。
- 可用于限制资源(如线程池)的使用。
- 缓存(Cache):
- 提供缓存机制来存储结果,以减少重复的计算和网络调用。
-
超时(Timeout)
- 避免单个调用时间过长,消耗太多资源。
HA 系列
隔离器(Bulkhead)
超时(Timeout)
断路器(Circuit Breaker) / 熔断
java 知识进阶面试-13-HA 熔断 Sentinel vs Hystrix
降级 downgrade
重试
java retry(重试) spring retry, guava retrying 详解
更好的 java 重试框架 sisyphus 配置的 2 种方式介绍
更好的 java 重试框架 sisyphus 的 3 种使用方式
限流
高可用之限流-06-slide window 滑动窗口 sentinel 源码
高可用之限流 09-guava RateLimiter 入门使用简介 & 源码分析
缓存
缓存实战(1)缓存雪崩、缓存击穿和缓存穿透入门简介及解决方案
Cache Travel-03-进程内缓存,服务间传递数据选择 mq 还是 cache?数据一致性问题
手写 Redis 系列
java从零手写实现redis(一)如何实现固定大小的缓存?
java从零手写实现redis(三)redis expire 过期原理
java从零手写实现redis(三)内存数据如何重启不丢失?
java从零手写实现redis(五)过期策略的另一种实现思路
java从零手写实现redis(六)AOF 持久化原理详解及实现
java从零手写实现redis(七)LRU 缓存淘汰策略详解
java从零开始手写redis(八)朴素 LRU 淘汰算法性能优化
java从零开始手写redis(九)LRU 缓存淘汰算法如何避免缓存污染
java从零开始手写redis(十)缓存淘汰算法 LFU 最少使用频次
java从零开始手写redis(十一)缓存淘汰算法 COLOK 算法
java从零开始手写redis(十二)过期策略如何实现随机 keys 淘汰
java从零开始手写redis(十三)redis渐进式rehash详解
java从零开始手写redis(十四)JDK HashMap 源码解析
java从零开始手写redis(十四)JDK ConcurrentHashMap 源码解析
java从零开始手写redis(十五)实现自己的 HashMap
java从零开始手写redis(十六)实现渐进式 rehash map
缓存实战汇总
缓存实战(1)缓存雪崩、缓存击穿和缓存穿透入门简介及解决方案
缓存实战(2)布隆过滤器是啥?guava 的 BloomFilter 使用
缓存实战(3)让你彻底搞懂布隆过滤器!实现一个自己的BloomFilter
缓存实战(4)bloom filter 使用最佳实践,让你少踩坑
缓存相关开源组件
redis-config: 兼容各种常见的 redis 配置模式
负载均衡
load balance 02-consistent hash algorithm 一致性哈希算法原理详解
load balance 03-consistent hash algorithm 一致性哈希算法 java 实现
load balance 04-java 从零手写实现负载均衡
多活架构
优雅发布
数据冗余与备份
X-Pipe 是由携程框架部门研发的Redis多数据中心复制管理系统
CDN
监控报警
监控报警系统-01-overview 如何设计监控报警系统?01-概览
监控报警系统-02-merge 如何设计监控报警系统报警合并和抑制?
自动恢复/自愈
开源框架
高可用开源库之 Resilience4j-01-Netflix Hystrix 的替代者 overview
高可用开源库之 Resilience4j-02-chat 聊一聊
高可用开源库之 阿里流控组件 sentinel-01-overview 面向云原生微服务的高可用流控防护组件
高可用开源库之 阿里流控组件 sentinel-02-chat
拓展阅读
chat
服务的高可用有哪些保障的手段?
服务的高可用性是指服务能够在大多数情况下保持正常运行,避免单点故障并保证在系统出现问题时尽量减少影响。为了保障服务的高可用,通常会使用以下手段:
1. 负载均衡
通过负载均衡器(如 Nginx、HAProxy、F5 等)将流量分发到多个服务实例上,避免单一实例过载或故障影响整体服务的可用性。常见的策略包括:
- 轮询:请求依次分配给每个实例。
- 最小连接数:请求分配给连接数最少的实例。
- 权重:根据实例的性能和处理能力分配流量。
2. 故障转移(Failover)
当服务或节点发生故障时,自动将流量切换到备用的节点或服务。故障转移通常分为两种:
- 主动故障转移:检测到主服务不可用时,自动切换到备用服务。
- 被动故障转移:依赖监控系统检测故障,手动或自动切换服务。
3. 集群和分布式部署
将服务部署到多个节点上,组成集群。即使某个节点或实例失效,其他节点仍然可以继续提供服务。这种方法尤其适合分布式系统,常见的技术包括:
- Kubernetes:用于自动化部署、扩展和管理容器化应用。
- Docker Swarm:提供轻量级的集群管理和调度功能。
4. 自动扩展
根据实时的流量和负载情况,动态增加或减少服务实例数量。这保证了在高负载时系统能够扩展资源应对,低负载时减少资源以节省成本。自动扩展常见于:
- 云服务提供商:如 AWS Auto Scaling、Google Cloud Autoscaler。
- Kubernetes Horizontal Pod Autoscaler (HPA):根据 CPU 或其他资源指标自动调整 Pod 的数量。
5. 数据冗余与备份
高可用的服务需要保证数据不丢失,因此通常会采用数据冗余、同步和备份策略。包括:
- 主从复制:数据库采用主从复制,主数据库提供读写操作,从数据库作为备份或只读操作。
- 多机房部署:将数据和服务同时部署在多个地理位置的机房,保证某个机房不可用时,其他机房可以接管服务。
- 定期备份:定期进行数据备份,保障在灾难恢复时有数据可以恢复。
6. 熔断与降级
在高并发或某些依赖的服务出现异常时,主动对部分服务进行熔断或降级处理,避免系统过载导致整体不可用。常用的模式包括:
- 熔断器(Circuit Breaker):当检测到某个依赖服务响应异常时,短时间内停止对该服务的请求,避免影响主服务。
- 服务降级:在服务压力过大时,主动降低某些非核心功能的质量,保证核心功能正常运行。
7. 健康检查与自动恢复
持续监控服务的健康状态(如心跳检测、响应时间等),当发现某个实例不健康时,自动将其移除并重新启动。Kubernetes 的 Liveness Probe 和 Readiness Probe 就是常见的健康检查机制。
8. 无状态化服务
服务的无状态化设计可以提升高可用性。无状态服务可以使得任何请求不依赖某个特定的实例或服务器,可以任意分发到不同的节点,增强服务的弹性与容错能力。
9. CDN(内容分发网络)
对于静态资源的分发,CDN 可以大幅减少服务器压力,并通过多节点缓存的方式减少单点故障。即使某个节点失效,其他节点仍然可以提供资源。
10. 多活架构
多活架构允许同一个服务同时在多个不同的地理位置或者数据中心运行,当某个数据中心或服务实例不可用时,其他位置的服务可以无缝接替。这种架构通常结合 DNS 负载均衡或 Global Load Balancer 实现。
11. 服务限流
当系统受到突发流量冲击时,可以通过限流策略(如令牌桶、漏桶算法)对请求数量进行限制,防止系统过载导致的崩溃。
通过上述手段,系统可以显著提升可用性,减少停机时间,并能够快速恢复故障。在实际应用中,往往需要根据业务场景和需求结合多种方法来构建高可用架构。