自动熔断 python

# 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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值