HA 主要组件

  1. 断路器(Circuit Breaker)
    • 用于监控服务调用的失败率,并在达到某个阈值后打开断路器,阻止进一步的调用,以避免对后端服务的过载。
    • 提供恢复机制,在一定时间后自动尝试恢复调用。
  2. 重试(Retry)
    • 自动重试失败的操作,支持设置重试次数和延迟。
    • 可以与断路器结合使用,增强调用的成功率。
  3. 限流(Rate Limiter)
    • 限制单位时间内的请求次数,防止服务被过载。
    • 可以按用户、IP 或其他维度进行限流。
  4. 隔离器(Bulkhead)
    • 通过将服务分割为多个隔离的部分,防止某一部分的故障影响到整个系统。
    • 可用于限制资源(如线程池)的使用。
  5. 缓存(Cache)
    • 提供缓存机制来存储结果,以减少重复的计算和网络调用。
  6. 超时(Timeout)

    • 避免单个调用时间过长,消耗太多资源。

HA 系列

隔离器(Bulkhead)

高可用之隔离器(Bulkhead)-01-概览

高可用之隔离器(Bulkhead)-02-聊一聊隔离器

超时(Timeout)

高可用之超时(Timeout)-02-聊一聊超时

断路器(Circuit Breaker) / 熔断

高可用之熔断-01-概览

高可用之熔断-02-聊一聊熔断

java 知识进阶面试-13-HA 熔断 Sentinel vs Hystrix

降级 downgrade

高可用之降级-01-概览

高可用篇之异地多活-05-服务降级

重试

重试框架介绍:Guava Retry

java retry(重试) spring retry, guava retrying 详解

更好的 java 重试框架 sisyphus 入门简介

更好的 java 重试框架 sisyphus 配置的 2 种方式介绍

更好的 java 重试框架 sisyphus 的 3 种使用方式

限流

开源组件 rate-limit: 限流

高可用之限流-01-入门介绍

高可用之限流-02-如何设计限流框架

高可用之限流-03-Semaphore 信号量做限流

高可用之限流-04-fixed window 固定窗口

高可用之限流-05-slide window 滑动窗口

高可用之限流-06-slide window 滑动窗口 sentinel 源码

高可用之限流-07-token bucket 令牌桶算法

高可用之限流 08-leaky bucket漏桶算法

高可用之限流 09-guava RateLimiter 入门使用简介 & 源码分析

缓存

Cache Travel-00-index

缓存实战(1)缓存雪崩、缓存击穿和缓存穿透入门简介及解决方案

Cache Travel-01-Talk

Cache Travel-02-history

Cache Travel-03-进程内缓存,服务间传递数据选择 mq 还是 cache?数据一致性问题

Cache Travel-04-in action

Cache Travel-05-LRUMAP

Cache Travel-06-Tair

Cache Travel-07-如何正确的缓存

Cache Travel-08-更好的使用缓存

手写 Redis 系列

java从零手写实现redis(一)如何实现固定大小的缓存?

java从零手写实现redis(三)redis expire 过期原理

java从零手写实现redis(三)内存数据如何重启不丢失?

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 使用最佳实践,让你少踩坑

java 从零实现属于你的 redis 分布式锁

3天时间,我是如何解决redis bigkey删除问题的?

redis 多路复用

缓存相关开源组件

cache: 手写渐进式 redis

common-cache: 通用缓存标准定义

redis-config: 兼容各种常见的 redis 配置模式

lock: 开箱即用的分布式锁

resubmit: 防重复提交

rate-limit: 限流

负载均衡

load balance 01-负载均衡基础知识

load balance 02-consistent hash algorithm 一致性哈希算法原理详解

load balance 03-consistent hash algorithm 一致性哈希算法 java 实现

load balance 04-java 从零手写实现负载均衡

多活架构

高可用篇之异地多活异地双活入门介绍

高可用篇之异地多活-02-架构设计

高可用篇之异地多活-03-单元化介绍

高可用篇之异地多活-04-分布式介绍

高可用篇之异地多活-05-服务降级

优雅发布

数据冗余与备份

MySQL 高可用介绍

Redis 高可用介绍

X-Pipe 是由携程框架部门研发的Redis多数据中心复制管理系统

CDN

CDN 加速原理

CDN chat

监控报警

监控报警系统-01-overview 如何设计监控报警系统?01-概览

监控报警系统-02-merge 如何设计监控报警系统报警合并和抑制?

监控报警系统-03-why 根因分析?归因分析? 故障定位

监控报警系统-04-handle 处理流程

监控报警系统-05-dispersion 离散度

监控报警系统-06-database 数据库设计

自动恢复/自愈

开源框架

高可用开源库之 Hystrix-01-概览

高可用开源库之 Hystrix-02-聊一聊

高可用开源库之 Resilience4j-01-Netflix Hystrix 的替代者 overview

高可用开源库之 Resilience4j-02-chat 聊一聊

高可用开源库之 阿里流控组件 sentinel-01-overview 面向云原生微服务的高可用流控防护组件

高可用开源库之 阿里流控组件 sentinel-02-chat

拓展阅读

Bloom Filter

Cache 之旅系列

ActiveMQ

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 ProbeReadiness Probe 就是常见的健康检查机制。

8. 无状态化服务

服务的无状态化设计可以提升高可用性。无状态服务可以使得任何请求不依赖某个特定的实例或服务器,可以任意分发到不同的节点,增强服务的弹性与容错能力。

9. CDN(内容分发网络)

对于静态资源的分发,CDN 可以大幅减少服务器压力,并通过多节点缓存的方式减少单点故障。即使某个节点失效,其他节点仍然可以提供资源。

10. 多活架构

多活架构允许同一个服务同时在多个不同的地理位置或者数据中心运行,当某个数据中心或服务实例不可用时,其他位置的服务可以无缝接替。这种架构通常结合 DNS 负载均衡或 Global Load Balancer 实现。

11. 服务限流

当系统受到突发流量冲击时,可以通过限流策略(如令牌桶、漏桶算法)对请求数量进行限制,防止系统过载导致的崩溃。

通过上述手段,系统可以显著提升可用性,减少停机时间,并能够快速恢复故障。在实际应用中,往往需要根据业务场景和需求结合多种方法来构建高可用架构。

参考资料

熔断

springcloud(四):熔断器Hystrix - 纯洁的微笑

服务熔断、降级、限流、异步RPC – HyStrix