熔断限流降级
熔断、限流、降级都是保持系统稳定运行的策略,但针对的场景有所不同
熔断
服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用
上面的解释中有两个很关键的词,一个是暂时,一个是停止。
停止是说,当前服务一旦对下游服务进行熔断,当请求到达时,当前服务不再对下游服务进行调用,而是使用设定好的策略(如构建默认值)直接返回
暂时是说,熔断后,并不会一直不再调用下游服务,而是以一定的策略(如每分钟调用 10 次,若均返回成功,则增大调用量)试探调用下游服务,
当下游服务恢复可用时,自动停止熔断。
1615127329438.drawio.html
18.8 KB
熔断
如上图,当 ServiceD 不可用时,ServiceB 应对 ServiceD 进行熔断。
熔断机器
限流
限流是指上游服务对本服务请求 QPS 超过阙值时,通过一定的策略(如延迟处理、拒绝处理)对上游服务的请求量进行限制,以保证本服务不被压垮,从而持续提供稳定服务。常见的限流算法有滑动窗口、令牌桶、漏桶等
1615127703954.drawio.html
20.73 KB
限流
如上图,当 ServiceB 对 ServiceD 请求过多时,ServiceD 可以放弃一部分请求,保证自身服务的稳定
常见限流算法
降级
降级是指当自身服务压力增大时,采取一些手段,增强自身服务的处理能力,以保障服务的持续可用。比如,下线非核心服务以保证核心服务的稳定、降低实时性、降低数据一致性
常见降级策略
总结
| 措施 |
产生原因 |
针对服务 |
| 熔断 |
下游服务不可用 |
下游服务 |
| 降级 |
自身服务的处理能力不够 |
自身服务 |
| 限流 |
上游服务请求增多 |
上游服务 |
常用框架:hystrix, sentinel
Pandas内存占用高因默认使用宽类型(如int64/float64),而实际数据范围小;应检查取值范围后降级为最小合适类型(如int8/int16/Int8/float32),注意NaN、ID列和category类型适用场景。 为什么df.info()显示内存用了2GB,但实际数据没那么多? 因为...
view()不分配新内存而共享数据缓冲区,故修改视图即修改原数组;copy()分配新内存实现一层深拷贝,但object数组需deepcopy才彻底隔离。 为什么arr.view()修改原数组? 因为view()不分配新内存,只是换了个“眼镜”看同一块内存。它共享数据缓冲区(arr.data),改视图...
虚拟环境不能降级特定包,因其管理的是整个Python解释器及所有包;ABI不匹配是二进制硬限制,需降级Python解释器本身,如用pyenv或conda创建Python3.11独立环境。 为什么虚拟环境不能“降级特定包” 虚拟环境本身不提供“只降级某个第三方包”的能力——它管理的是整个Python解...
Python3中/统一为真除(精确除),结果总是float;地板除用//,语义明确无歧义。此设计提升可读性与可预测性,避免Python2中类型敏感导致的隐式整除错误。 Python2的/在整数间做地板除,Python3的/总是精确除——这不是bug,是语言设计的主动断裂。 Python2中/的行为取...
create_task是推荐的、明确“立刻调度协程”的方式;ensure_future是底层通用工具,用于确保任意可等待对象具备Future接口,不专为协程设计,也不保证调度。 ensure_future和create_task本质都是把协程转成Task,但调用时机和语义不同 直接说结论:creat...
Python3的input()不再执行表达式求值,因设计者移除eval()调用以防止RCE风险;它仅返回字符串,需手动转换并处理异常,空输入或空白字符须预处理。 Python3的input()为什么不再执行表达式求值 因为设计者明确移除了eval()调用逻辑,避免用户输入任意代码导致的远程代码执行(...
__str__面向用户,控制print()和str()输出;__repr__面向开发者,控制repr()、交互式回显和调试日志输出;二者语义不同,必须分别实现且返回str类型。 直接说结论:用__str__控制print()和str()的输出,面向用户;用__repr__控制repr()、交互式环境...
空数组的shape是(0,),表示一维且长度为0;(0)是整数、[]是列表,均错误;()表示零维标量,与(0,)本质不同;判断空数据应使用np.prod(arr.shape)==0。 空数组的shape是(0,),不是[]或(0) NumPy中np.array([])的shape确实是(0,)——这...