[3.1-3.5] FAM-Edge 全链路 - API-Gateway/Video-Preprocessor/AI-Orchestrator/模型适配器(基类+Ollama+Gemini)/熔断器/JSON解析容错 + 配置
This commit is contained in:
47
fam-edge/src/fam_edge/model_adapters/circuit_breaker.py
Normal file
47
fam-edge/src/fam_edge/model_adapters/circuit_breaker.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""
|
||||
熔断器 - 每个云端模型独立实例
|
||||
|
||||
状态机: CLOSED -> OPEN -> HALF_OPEN -> CLOSED/OPEN
|
||||
- 连续 threshold 次失败 -> OPEN
|
||||
- 冷却 cooldown 秒后 -> HALF_OPEN(允许一次探测)
|
||||
- 探测成功 -> CLOSED;探测失败 -> 重新 OPEN
|
||||
"""
|
||||
from collections import deque
|
||||
import time
|
||||
|
||||
|
||||
class CircuitBreaker:
|
||||
def __init__(self, threshold: int = 5, cooldown: int = 900, enabled: bool = True):
|
||||
self.enabled = enabled
|
||||
if enabled:
|
||||
self.failures = deque(maxlen=threshold)
|
||||
else:
|
||||
self.failures = None
|
||||
self.threshold = threshold
|
||||
self.cooldown = cooldown
|
||||
self.state = 'CLOSED'
|
||||
self.last_failure = None
|
||||
|
||||
def record_failure(self):
|
||||
if not self.enabled:
|
||||
return
|
||||
self.failures.append(time.time())
|
||||
if len(self.failures) >= self.threshold:
|
||||
self.state = 'OPEN'
|
||||
self.last_failure = time.time()
|
||||
|
||||
def record_success(self):
|
||||
if not self.enabled:
|
||||
return
|
||||
self.failures.clear()
|
||||
self.state = 'CLOSED'
|
||||
|
||||
def is_open(self):
|
||||
if not self.enabled:
|
||||
return False
|
||||
if self.state == 'OPEN' and self.last_failure and time.time() - self.last_failure > self.cooldown:
|
||||
self.state = 'HALF_OPEN'
|
||||
return self.state == 'OPEN'
|
||||
|
||||
def __repr__(self):
|
||||
return f"CircuitBreaker(state={self.state}, enabled={self.enabled})"
|
||||
Reference in New Issue
Block a user