feat: add SourceNotConfiguredError and the governance backend reason
Pure addition ahead of the reparenting, so this commit leaves every existing caller and test untouched. SourceNotConfiguredError deliberately stays outside GatewayUnavailableError: a source name that is not in the limiter's config dict is an assembly defect, not a transient outage, and folding it into the retryable family would let a typo retry forever without ever reaching a dead letter queue. The retry_after_s default is 5.0 rather than 0 because a backlog released at zero delay would stampede a backend that is already down.
This commit is contained in:
@@ -17,6 +17,7 @@ from polygateway.errors import (
|
||||
RequestRejectedError,
|
||||
ResultInvalidError,
|
||||
SourceDeadError,
|
||||
SourceNotConfiguredError,
|
||||
TransientError,
|
||||
)
|
||||
from polygateway.ocr import OcrClient
|
||||
@@ -58,6 +59,7 @@ __all__ = [
|
||||
"ResultInvalidError",
|
||||
"SourceConfig",
|
||||
"SourceDeadError",
|
||||
"SourceNotConfiguredError",
|
||||
"TransientError",
|
||||
"__version__",
|
||||
"gather_bounded",
|
||||
|
||||
@@ -5,8 +5,22 @@
|
||||
"""
|
||||
|
||||
SCOPE_REASONS = frozenset(
|
||||
{"circuit_open", "retry_exhausted", "stalled", "quota_exhausted", "no_sources"}
|
||||
{
|
||||
"circuit_open",
|
||||
"retry_exhausted",
|
||||
"stalled",
|
||||
"quota_exhausted",
|
||||
"no_sources",
|
||||
"governance_backend_down", # issue #7: 限流/熔断后端故障(fail-closed → 整个 scope 发不出请求)
|
||||
}
|
||||
)
|
||||
GOVERNANCE_BACKEND_RETRY_AFTER_S = 5.0
|
||||
"""治理后端故障的建议重投间隔(秒)。
|
||||
|
||||
**不是环境配置项**——后端恢复时间物理上不可知(不同于熔断冷却有确定到期时刻),
|
||||
故取一个保守固定值;下游有自己的退避策略时可忽略本字段。取 0 会让积压任务零延迟
|
||||
同时冲击已挂掉的后端,把一次故障放大成一场风暴(issue #7 §3.2)。
|
||||
"""
|
||||
SOURCE_REASONS = frozenset(
|
||||
{
|
||||
"network_error",
|
||||
@@ -127,5 +141,14 @@ class AllSourcesExhausted(GatewayUnavailableError): # noqa: N818 — ARCH §6.1
|
||||
"""重试预算耗尽 / 无可用源 / 配额 fail-fast 等 scope 级失败。"""
|
||||
|
||||
|
||||
class SourceNotConfiguredError(PolyGatewayError):
|
||||
"""源名不在限流后端的配置字典中: 装配缺陷,正常不可达。
|
||||
|
||||
**有意不在** `GatewayUnavailableError` 之下: 它不是"暂时不可用"而是"配置写
|
||||
错了",必须消耗失败预算进死信让人看见;归入可重投家族会让配置错误的任务永远
|
||||
重投、永不告警——正是 issue #7 要修的那个 bug 的镜像(§3.4)。
|
||||
"""
|
||||
|
||||
|
||||
class GovernanceBackendError(PolyGatewayError):
|
||||
"""限流/熔断状态后端自身故障: 必须报错而非放行(防击穿网关,降级方向铁律)。"""
|
||||
|
||||
Reference in New Issue
Block a user