ForcePilot/backend/package/yuxi/channels/contract/plugin/extension_point.py

190 lines
6.7 KiB
Python
Raw Normal View History

"""扩展点协议。
定义扩展点相关的枚举不可变值对象与 Stage Protocol包括冲突策略
失败策略阶段槽位事件订阅配置源与管道阶段协议
插件通过扩展点向宿主注入自身逻辑宿主按优先级串联执行
扩展点失败策略§9.3每个扩展点必须声明 ``failure_policy`` 字段
标识插件失败时的处理方式降级 / 熔断 / 隔离确保插件故障隔离性
§9.5"插件失败不得拖垮宿主"
命名约定
- ``FailureStrategy``本模块**阶段执行**失败策略TERMINATE /
SKIP / COMPENSATE / DEGRADE ``Stage.failure`` 字段使用
描述管道阶段执行失败时的处理方式
- ``FailurePolicy``manifest 模块**插件隔离**失败策略
DEGRADE / CIRCUIT_BREAK / ISOLATE由扩展点
``failure_policy`` 字段使用描述插件故障时的隔离方式
两者语义不同字段与类型必须一致命名以避免混淆
"""
from __future__ import annotations
from dataclasses import dataclass
from enum import StrEnum
from typing import Any, Protocol, runtime_checkable
from yuxi.channels.contract.dtos.plugin import (
ConfigDecryptor,
ConfigLoader,
EventHandler,
)
from yuxi.channels.contract.plugin.manifest import FailurePolicy
class ConflictStrategy(StrEnum):
"""冲突策略。
标识同一锚点多个插件阶段的冲突解决方式继承 ``str, Enum`` 以支持
JSON 序列化与字符串比较
取值
CHAIN: 链式调用按优先级串联执行
REJECT: 拒绝同操作 ID 冲突时拒绝装配
OVERRIDE: 覆盖后注册者覆盖先注册者
"""
CHAIN = "chain"
REJECT = "reject"
OVERRIDE = "override"
class FailureStrategy(StrEnum):
"""阶段失败策略。
标识管道阶段执行失败时的处理方式继承 ``str, Enum`` 以支持 JSON 序列化
与字符串比较
取值
TERMINATE: 终止管道
SKIP: 跳过阶段
COMPENSATE: 执行补偿
DEGRADE: 降级
"""
TERMINATE = "terminate"
SKIP = "skip"
COMPENSATE = "compensate"
DEGRADE = "degrade"
@dataclass(frozen=True)
class StageSlot:
"""阶段槽位。
描述插件向管道锚点注入的阶段槽位包括管道名锚点阶段实例优先级
是否允许多个阶段共存冲突策略与失败策略用于扩展点装配
字段
pipeline: 管道名inbound | outbound | control
anchor: 锚点阶段名 before:route | after:security
stage: Stage Protocol 实例
priority: 优先级默认 100越小越先执行
multi: 是否允许多个阶段插入同一锚点默认 False
conflict_strategy: 冲突策略默认 CHAIN
failure_policy: 插件隔离失败策略默认 DEGRADE插件失败时降级
跳过不拖垮宿主 §9.5
"""
pipeline: str
anchor: str
stage: Stage
priority: int = 100
multi: bool = False
conflict_strategy: ConflictStrategy = ConflictStrategy.CHAIN
failure_policy: FailurePolicy = FailurePolicy.DEGRADE
@dataclass(frozen=True)
class EventSubscription:
"""事件订阅。
描述插件对领域事件的订阅包括事件类型处理器优先级与失败策略
用于事件总线分发注册
字段
event_type: 事件类型PairingApproved | ConfigChanged | PluginFailed | ...
handler: 事件处理 Protocol 实例
priority: 优先级默认 100
failure_policy: 插件隔离失败策略默认 DEGRADEhandler 失败时
跳过本次调用不中断其他订阅者 §9.5
"""
event_type: str
handler: EventHandler
priority: int = 100
failure_policy: FailurePolicy = FailurePolicy.DEGRADE
@dataclass(frozen=True)
class ConfigSource:
"""配置源。
描述插件提供的配置源包括源 ID加载器可选解密器与失败策略用于
配置端口的多源加载
字段
source_id: ID
loader: 配置加载 Protocol 实例
decryptor: 配置解密 Protocol 实例可选
failure_policy: 插件隔离失败策略默认 DEGRADE加载失败时
跳过此源回退至其他配置源 §9.5
"""
source_id: str
loader: ConfigLoader
decryptor: ConfigDecryptor | None = None
failure_policy: FailurePolicy = FailurePolicy.DEGRADE
@runtime_checkable
class Stage(Protocol):
"""管道阶段 Protocol。
由插件实现描述管道阶段的元信息与处理方法使用
``@runtime_checkable`` 装饰以支持 ``isinstance`` 检查阶段处理为
异步方法由管道按优先级串联调用
与应用层 ``AppStage`` Protocol 对齐
- ``compensate`` ``str | None``携带补偿阶段名称
"outbox-rollback"None 表示无补偿
- ``process`` 返回 ``bool``True 表示成功False 或抛出异常表示
失败
优先级规则§7.8
- 1~49安全/合规相关阶段必须最先执行 DM 安全检查审计前置
- 50~99业务增强阶段在核心阶段之前增强上下文如渠道路由增强
身份预解析
- 100默认优先级大多数插件阶段
- 101~200业务后处理阶段在核心阶段之后处理如消息格式化增强
指标采集
- 201+可观测性/诊断阶段必须最后执行如追踪收尾诊断快照
冲突解决
- 同一锚点相同优先级的多个插件阶段 **必须** 拒绝装配并报告冲突详情
- 插件 **不得** 使用 ``replace`` 锚点覆盖核心阶段除非扩展点显式允许
"""
id: str
reads: tuple[str, ...]
writes: tuple[str, ...]
idempotent: bool
thread_safe: bool
failure: FailureStrategy
compensate: str | None
async def process(self, context: Any) -> bool:
"""处理管道阶段。
参数
context: 管道上下文
返回
True 表示成功False 或抛出异常表示失败
@consistency: 阶段处理stage-processed ``Stage.reads`` / ``Stage.writes``
读写上下文失败按 ``Stage.failure`` 策略处理
@idempotent: 取决于 ``Stage.idempotent`` 字段声明由阶段实现者明确标注
"""
...