首页
/ PyBreaker 使用与技术文档

PyBreaker 使用与技术文档

2024-12-17 15:13:47作者:凌朦慧Richard

1. 安装指南

安装 PyBreaker 最简单的方式是使用 pip 工具从 PyPI 下载最新稳定版本:

pip install pybreaker

如果您是 Git 用户,并希望安装最新的开发版本,可以按照以下步骤操作:

git clone git://github.com/danielfm/pybreaker.git
cd pybreaker
# 在 Windows 下请省略 ./
./pw test
pip install -e .

2. 项目使用说明

PyBreaker 是一种 Python 实现的电路断路器模式,该模式在 Michael T. Nygard 的书籍 Release It! 中有所描述。电路断路器允许一个子系统在失败时不会破坏整个系统。这是通过在危险操作(通常是集成点)周围包装一个可以在系统不健康时绕过调用的组件来实现的。

使用方法

首先,为每个要保护的集成点创建一个 CircuitBreaker 实例:

import pybreaker

# 用于数据库集成点
db_breaker = pybreaker.CircuitBreaker(fail_max=5, reset_timeout=60)

CircuitBreaker 实例应该在应用程序范围内全局存在,例如,跨请求存在。

如果希望使用 Redis 作为后端存储,可以在初始化 CircuitBreaker 时指定一个 CircuitRedisStorage

import pybreaker
import redis

redis = redis.StrictRedis()
db_breaker = pybreaker.CircuitBreaker(
    fail_max=5,
    reset_timeout=60,
    state_storage=pybreaker.CircuitRedisStorage(pybreaker.STATE_CLOSED, redis))

请注意,初始化 Redis 连接时不要将 decode_responses 设置为 True,这会强制 redis 返回 ASCII 对象,并在 Python3+ 中因为 AttributeError: 'str' object has no attribute 'decode' 而失败。

事件监听

如果只是想要在特定事件发生时执行操作,无需子类化 CircuitBreaker,而是子类化 CircuitBreakerListener

class DBListener(pybreaker.CircuitBreakerListener):
    "执行数据库操作的监听器"

    def before_call(self, cb, func, *args, **kwargs):
        "在电路断路器 `cb` 调用 `func` 之前被调用"
        pass

    def state_change(self, cb, old_state, new_state):
        "当电路断路器 `cb` 状态改变时被调用"
        pass

    def failure(self, cb, exc):
        "当函数调用引发系统错误时被调用"
        pass

    def success(self, cb):
        "当函数调用成功时被调用"
        pass

电路断路器的工作原理

假设想要在更新数据库中的 customer 表的行时使用电路断路器:

@db_breaker
def update_customer(cust):
    # 执行操作...
    pass

# 将触发电路断路器
updated_customer = update_customer(my_customer)

如果不使用装饰器语法:

def update_customer(cust):
    # 执行操作...
    pass

# 将触发电路断路器
updated_customer = db_breaker.call(update_customer, my_customer)

或者,作为上下文管理器与 with 语句一起使用:

# 将触发电路断路器
with db_breaker.calling():
    # 执行操作...
    pass

根据默认参数,电路断路器 db_breakerupdate_customer 中连续失败 5 次后将自动打开电路。

当电路打开时,所有对 update_customer 的调用都会立即失败(抛出 CircuitBreakerError),而无需尝试执行实际操作。如果希望在电路跳闸时抛出原始错误,可以将 throw_new_error_on_trip 选项设置为 False

pybreaker.CircuitBreaker(..., throw_new_error_on_trip=False)

60 秒后,电路断路器将允许下一个对 update_customer 的调用通过。如果该调用成功,则电路关闭;如果失败,则电路再次打开,直到另一个超时过期。

3. 项目API使用文档

PyBreaker 提供了用于监控和更改其当前状态的属性和函数:

# 获取当前连续失败次数
print(db_breaker.fail_counter)

# 获取/设置最大连续失败次数
print(db_breaker.fail_max)
db_breaker.fail_max = 10

# 获取/设置当前重置超时时间(秒)
print(db_breaker.reset_timeout)
db_breaker.reset_timeout = 60

# 获取当前状态,即 'open', 'half-open', 'closed'
print(db_breaker.current_state)

# 关闭电路
db_breaker.close()

# 半开电路
db_breaker.half_open()

# 打开电路
db_breaker.open()

这些属性和函数应该被以某种方式暴露给运维人员,因为它们可以帮助他们检测系统中的问题。

4. 项目安装方式

请参考上述“安装指南”部分,获取 PyBreaker 的安装方法。

热门项目推荐
相关项目推荐

项目优选

收起
MateChatMateChat
前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。 官网地址:https://matechat.gitcode.com
383
36
Python-100-DaysPython-100-Days
Python - 100天从新手到大师
Python
611
115
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
205
58
Ffit-framework
FIT: 企业级AI开发框架,提供多语言函数引擎(FIT)、流式编排引擎(WaterFlow)及Java生态的LangChain替代方案(FEL)。原生/Spring双模运行,支持插件热插拔与智能聚散部署,无缝统一大模型与业务系统。
Java
113
13
RuoYi-Cloud-Vue3RuoYi-Cloud-Vue3
🎉 基于Spring Boot、Spring Cloud & Alibaba、Vue3 & Vite、Element Plus的分布式前后端分离微服务架构权限管理系统
Vue
45
29
cjoycjoy
a fast,lightweight and joy web framework
Cangjie
11
2
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
286
79
hertzhertz
Go 微服务 HTTP 框架,具有高易用性、高性能、高扩展性等特点。
Go
7
1
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
60
48
open-eBackupopen-eBackup
open-eBackup是一款开源备份软件,采用集群高扩展架构,通过应用备份通用框架、并行备份等技术,为主流数据库、虚拟化、文件系统、大数据等应用提供E2E的数据备份、恢复等能力,帮助用户实现关键数据高效保护。
HTML
90
65