按 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>
38 lines
1.7 KiB
Python
38 lines
1.7 KiB
Python
"""交易服务容器:集中管理交易侧服务实例,用于依赖注入
|
|
|
|
持有两类东西:
|
|
- 登录态会话(auth_session)——加购与下单必须用同一份 cookie,全程共享
|
|
- 本地下单 worker(可选)——RAKUTEN_ORDER_GATEWAY_URL 留空时整套不构造
|
|
|
|
worker 的子组件(gateway_client / local_db / evidence_store / runner)都在
|
|
app.trading.worker 包内,与抓取/网关互不 import;worker 需要商品数据时走抓取
|
|
服务的 HTTP 接口,需要任务调度时走网关的 HTTP 接口。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
|
|
from app.shared.config import Settings
|
|
from app.trading.services.auth_session import AuthSession
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class TradingContainer:
|
|
"""交易服务容器
|
|
|
|
与抓取容器最本质的差别不是字段多少,而是**这个进程有状态**:登录态、
|
|
订单、页面证据都属于某个具体账号,因此交易服务只能单实例运行
|
|
(或按账号分片),不能像抓取服务那样随意横向扩容。
|
|
|
|
worker_* 字段在 RAKUTEN_ORDER_GATEWAY_URL 留空时为 None——此时交易服务
|
|
只跑登录态接口,不起后台 worker。
|
|
"""
|
|
|
|
settings: Settings
|
|
auth_session: AuthSession
|
|
# 以下四项仅在 order_gateway_url 配置时构造;否则为 None,worker 不启动
|
|
worker_client: object | None = None # app.trading.worker.client.GatewayClient
|
|
worker_local_db: object | None = None # app.trading.worker.local_db.LocalDB
|
|
worker_evidence: object | None = None # app.trading.worker.evidence.EvidenceStore
|
|
worker_runner: object | None = None # app.trading.worker.runner.WorkerRunner
|