# encoding=utf8
import time
import json
import logging
import threading
from random import random
import redis
class AutoKnightError(Exception):
pass
class AutoKnight(object):
"""
judge处理方式:
1:判断服务qps
2:更新catch_present
3:按比例降级服务,当前服务级百分比为100%时,仍然保持max(0.1%, 100)流量进行尝试,以便更改需降级比例。
save_status 处理方式
1:将当前status,delay 存储到redis中
2:如果当前正常状态,且status = False or delay > tolerate_max_delay, 计算降级比例
3: 如果当前为降级状态,计算降级比例
calculate_present 计算降级比例
1:如果当前为正常状态,获取全部队列错误和delay,计算需降级的比例,存储至redis
2:如果当前为部分降级状态,计算降级比例应为前present * granularity 个(保证试错的实时响应),存储至redis
3:如果当前为全部降级状态,有一次成功后,将redis错误队列清空,qps释放至20%,存储至redis
"""
KNIGHT_ERROR_DELAY_PREFIX = 'auto_knight/granularity/error_delay/{consul_name}' # 时间窗口内的服务情况
CONSUL_KNIGHT_PRESENT_PREFIX = 'auto_knight/present/{consul_name}' # float 需要降级的比例
CONSUL_QPS_PREFIX = 'auto_knight/qps/{consul_name}/{time_stamp}' # 服务qps
def __init__(self, redis_client, consul_name,
granularity=100,
tolerate_max_delay=3000,
tolerate_max_error=0.1,
tolerate_present=0.1,
care_min_qps=None,
qps_window=1,
min_retry_qps_present=0.01,
fuse_recover_step=0.01,
fuse_recover_delay=1000,
**kwargs):
"""
自动熔断类
在监控粒度内,发生错误 或 延迟时,将会计算此时服务延迟率或错误率
当平均延迟大于tolerate_max_delay(ms)或错误率大于tolerate_max_error,此时的熔断比例将产生,公式为max(错误比例, 延迟比例)
当产生的熔断比例大于tolerate_present时,开启熔断
当熔断到100%时,仍然会开启min_retry_qps_present流量尝试恢复,最小0.001
当计算熔断比例小于当前熔断比例时,熔断比例下降,下降步长=fuse_recover_step,下降间隔=fuse_recover_delay(ms)
用法:
import redis
redis_client = redis.StrictRedis(host,port)
autoknight = AutoKnight(redis_client, 'text_consul_name')
# 用法1
try:
with autoknight:
you_method()
except AutoKnightError:
p
自动熔断 python
最新推荐文章于 2021-04-27 21:04:39 发布
本文分享了在实际工作中为满足自动降级需求,使用Python编写的自动熔断器,经过实践验证,其效果良好。
摘要由CSDN通过智能技术生成