实现下单任务网关与本地 worker
按 docs/order-gateway.md 落地:第三个部署单元 app.gateway(:31109)承担任务队列 + 状态镜像;本地 worker 在 app.trading.worker 内,按 RAKUTEN_ORDER_GATEWAY_URL 决定是否启动。规格 §5 最关键约束已守:租约过期绝不自动重投,恢复只能 reclaim, worker 收到 lease_count>1 时先核对站点订单。 站点交互(加购/下单/付款/订单列表反查)按规格 §10 留接口缝,site_interact.py 全部 NotImplementedError,verify.py 恒返回 unknown——等真实账号实测后再填, 不写猜测的提交逻辑。 310 个测试全绿,覆盖规格 §9 验收清单 12 条;架构测试守住三方互不 import。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
- 3xxx: 反爬/上游阻断相关错误
|
||||
- 4xxx: 页面解析错误
|
||||
- 5xxx: 加购/下单错误(需要账号登录态的写操作)
|
||||
- 6xxx: 下单任务编排错误(网关侧的租约与状态机)
|
||||
"""
|
||||
|
||||
|
||||
@@ -169,3 +170,57 @@ class OrderGuardError(AppError):
|
||||
|
||||
def __init__(self, message: str):
|
||||
super().__init__(message=message, code="ORDER_GUARD", err_code=5004, retryable=False)
|
||||
|
||||
|
||||
# ---- 下单任务编排(仅网关进程 app.gateway.main 使用)----
|
||||
# 下单不可逆,因此任务队列侧的错误一律标记 retryable=False——重复入队/重投
|
||||
# 都可能变成重复下单。详见 docs/order-gateway.md §8。
|
||||
|
||||
|
||||
class TaskNotFoundError(AppError):
|
||||
"""任务不存在"""
|
||||
|
||||
def __init__(self, task_id: str):
|
||||
super().__init__(
|
||||
message=f"任务不存在:{task_id}",
|
||||
code="TASK_NOT_FOUND",
|
||||
err_code=6001,
|
||||
retryable=False,
|
||||
status_code=404,
|
||||
)
|
||||
self.task_id = task_id
|
||||
|
||||
|
||||
class LeaseInvalidError(AppError):
|
||||
"""租约无效:不是持有者、已过期或任务已终结
|
||||
|
||||
worker 在 renew / report / reclaim 时必须校验自己是当前租约的持有者,且任务
|
||||
尚未终结。任意一条不满足都报 6002,让 worker 停下来而不是猜测当前状态。
|
||||
"""
|
||||
|
||||
def __init__(self, message: str = "租约无效"):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code="LEASE_INVALID",
|
||||
err_code=6002,
|
||||
retryable=False,
|
||||
status_code=409,
|
||||
)
|
||||
|
||||
|
||||
class InvalidTaskStateError(AppError):
|
||||
"""任务状态不允许该操作
|
||||
|
||||
例如对已终结(succeeded/failed/needs_human)的任务再 reclaim。与 6002 的区别:
|
||||
6002 是租约本身的问题(不是持有者 / 已过期),6003 是状态机层面的问题
|
||||
(当前状态不接受这个动作)。
|
||||
"""
|
||||
|
||||
def __init__(self, message: str = "任务状态不允许该操作"):
|
||||
super().__init__(
|
||||
message=message,
|
||||
code="INVALID_TASK_STATE",
|
||||
err_code=6003,
|
||||
retryable=False,
|
||||
status_code=409,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user