自动熔断 python

本文分享了在实际工作中为满足自动降级需求,使用Python编写的自动熔断器,经过实践验证,其效果良好。
摘要由CSDN通过智能技术生成
# 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
Nacos 可以与 Sentinel 集成,以实现动态的流量控制和熔断降级策略。这样,你可以使用 Nacos 配置中心来配置 Sentinel 规则,实现对应用程序的实时流量控制和熔断降级。 以下是集成 Nacos 和 Sentinel 的基本步骤: 1. 首先,你需要在应用程序中引入 Nacos 和 Sentinel 的客户端库。根据你使用的编程语言和框架,可能需要添加相应的依赖或库文件。 2. 在 Nacos 配置中心中创建配置项,用于存储 Sentinel 的规则配置。可以在 Nacos 控制台中手动创建或使用 API 自动创建。 3. 在应用程序中使用 Nacos 的配置读取 API,读取 Sentinel 规则配置。这些规则可以是流量控制规则、熔断降级规则等。 4. 将读取到的规则配置传递给 Sentinel 客户端,使其生效。这样,Sentinel 就会根据配置的规则对流量进行控制和熔断降级。 5. 在 Nacos 配置中心中更新规则配置时,应用程序会自动获取最新的配置,并且 Sentinel 会根据新的配置进行动态调整。 下面是一个示例伪代码,展示了如何集成 Nacos 和 Sentinel: ```python import nacos import sentinel # 创建 Nacos 客户端实例 client = nacos.NacosClient(server_addresses='nacos-server:8848') # 从 Nacos 获取 Sentinel 规则配置 config = client.get_config(data_id='sentinel-rules', group='your-group') # 将规则配置传递给 Sentinel 客户端 sentinel.load_rules(config) # 应用程序主逻辑 def main(): # 执行应用程序逻辑 do_something() if __name__ == '__main__': main() ``` 在上面的示例中,`client.get_config()` 方法用于从 Nacos 中获取 Sentinel 规则配置。然后,通过 `sentinel.load_rules()` 方法将规则配置传递给 Sentinel 客户端。 通过上述步骤,你可以实现 Nacos 和 Sentinel 的集成,实现动态的流量控制和熔断降级策略。在 Nacos 配置中心更新规则配置时,应用程序会自动获取最新的配置,并且 Sentinel 会根据新的配置进行动态调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值