跳转至

故障转移机制

FinVista 的核心特性之一是多数据源自动故障转移。

工作原理

当主数据源失败时,FinVista 会自动尝试备用数据源:

主数据源 (东方财富) → 失败
备用数据源 1 (新浪) → 失败
备用数据源 2 (腾讯) → 成功 ✓

熔断器模式

为防止故障蔓延,FinVista 实现了熔断器模式:

健康状态 → 连续 5 次失败 → 熔断(60秒)
    ↑                            ↓
    └── 连续 3 次成功 ← 半开状态

状态说明

状态 说明
健康 (Healthy) 数据源正常工作
半开 (Half-Open) 熔断恢复期,尝试请求
熔断 (Circuit Open) 数据源暂时不可用,跳过

配置熔断器

import finvista as fv

# 失败阈值(触发熔断的失败次数)
fv.config.failover.failure_threshold = 5

# 熔断时间(秒)
fv.config.failover.circuit_timeout = 60

# 恢复阈值(关闭熔断的成功次数)
fv.config.failover.success_threshold = 3

检查数据源健康状态

health = fv.get_source_health()
print(health)

输出示例:

{
    "cn_stock_daily": {
        "eastmoney": {
            "status": "healthy",
            "failures": 0,
            "avg_time": "0.5s"
        },
        "sina": {
            "status": "healthy",
            "failures": 0,
            "avg_time": "0.8s"
        },
        "tencent": {
            "status": "circuit_open",
            "failures": 5,
            "recover_at": "2024-01-15 10:31:00"
        }
    }
}

手动重置熔断器

# 重置特定数据源的熔断器
fv.reset_source_circuit("cn_stock_daily", "tencent")

自定义数据源优先级

# 设置数据源优先级(按顺序尝试)
fv.set_source_priority("cn_stock_daily", ["sina", "eastmoney", "tencent"])

强制使用特定数据源

# 不使用故障转移,强制使用东方财富
df = fv.get_cn_stock_daily("000001", source="eastmoney")

查看实际使用的数据源

df = fv.get_cn_stock_daily("000001")
print(f"数据来源: {df.attrs.get('source')}")

数据源列表

A 股日线

优先级 数据源 说明
1 eastmoney 东方财富,数据全面
2 sina 新浪财经,稳定可靠
3 tencent 腾讯财经,作为备用

A 股实时行情

优先级 数据源 说明
1 sina 新浪财经,速度快
2 tencent 腾讯财经
3 eastmoney 东方财富

基金数据

优先级 数据源 说明
1 tiantian 天天基金,数据权威

美股数据

优先级 数据源 说明
1 yahoo Yahoo Finance

最佳实践

1. 监控数据源健康

# 定期检查数据源状态
import schedule

def check_health():
    health = fv.get_source_health()
    for data_type, sources in health.items():
        for source, status in sources.items():
            if status['status'] != 'healthy':
                print(f"警告: {data_type}/{source} 状态异常")

schedule.every(5).minutes.do(check_health)

2. 异常处理

from finvista import AllSourcesFailedError

try:
    df = fv.get_cn_stock_daily("000001")
except AllSourcesFailedError:
    print("所有数据源都失败了,请稍后重试")

3. 生产环境建议

  • 设置合理的超时时间
  • 启用缓存减少请求
  • 配置代理提高稳定性
  • 监控数据源健康状态