跳到主要内容

servers_v2 差距分析与优化建议(历史归档快照)

Status

Superseded

Date

2026-03-23

Superseded By

  • docs/architecture/migration-readiness.md
  • docs/architecture/service-catalog.md
  • docs/architecture/http-entrypoints.md
  • docs/services/
  • docs/specs/recon/2026-04-22-recon-service-migration.md
  • docs/specs/worker-health/2026-04-22-worker-health-and-settlement-hardening.md

Important Note

This document is retained as a point-in-time historical analysis only.

It predates:

  • the documented middle_server migration posture
  • the extracted recon_service and recon_worker
  • the committed servers_v2/docker-compose.yml local stack
  • the worker-health and settlement hardening work

Do not use this file as the current migration source of truth. Use the superseding documents above instead.

原始分析日期: 2026-03-23 原始范围: 对比当时的 servers_v2/servers/,识别功能差距和优化机会。


1. 服务映射总览

v1 服务端口v2 服务端口迁移状态
web_server8002player_service + gateway 路由8002/8080已完成 — player_service 负责认证/资料/消息;gateway 将财务/游戏/记录路由到领域服务
admin_server8001admin_service8001大部分完成 — 核心 CRUD、统计、玩家管理、风控、安全配置、活动/优惠券管理均已实现,仅个别能力待确认
game_server8000game_service8000接近完成 — 7 个供应商回调已实现;SBO 下游未注册;缺少游戏同步工具
agent_server8003agent_service8003已完成 — 完全对等
wallet_server8004wallet_service + rolling_service + promotion_service8004/8005/8006已扩展 — 拆分为 3 个领域服务并有改进
middle_server8005(不替换)不在范围内
sms_server8006rgb_contracts.infra.sms(共享库 + 外部 sms_url 调用)部分迁移 — 共享库已有可运行的 SmsService + CoolSMS,但实际调用仍走外部 sms_url HTTP 服务
gateway8080新增 — JWT 认证、限流、路由转发、响应翻译

关键架构变化:

  • v2 新增 gateway 处理所有玩家端流量并路由到领域服务
  • v1 的单体 web_server 被拆分:认证 → player_service,财务 → wallet_service,游戏 → game_service,记录 → 多个服务
  • Gateway 已有完整的路由映射(详见 gateway/CLAUDE.md 路由表)
  • TRON 集成已有意弃用,改用 Plisio(见 servers_v2/CLAUDE.md

2. 各服务功能差距

2.1 Player Service + Gateway(替代 web_server)

v1 web_server 是一个包含约 59 个端点的单体。v2 中拆分为:

  • player_service(约 24 个端点):认证、资料、消息、公共接口
  • wallet_service:财务操作(充值、提现、转账)
  • game_service:游戏列表、启动、供应商列表
  • promotion_service:记录、使用优惠券、活动

gatewayplayer_routes.py,704 行)已将所有 v1 路径映射到 v2 领域服务目标端点。路由映射已完成

剩余缺口:Crypto Deposit 闭环 — v2 相比 v1 存在部分回退

v1 现状: wallet_server 的 deposit.py 在创建订单时已调用 Plisio API 并拿到了真实的 wallet_hash(链上地址)(见 deposit.py:659/673),回调也已实现(deposit.py:85)。但 web_url(支付页面链接)被注释置空(deposit.py:671),所以 v1 有"地址分配 + callback"闭环雏形,仅 web_url 未打通。

v2 现状: wallet_service 的 queries.pydeposit/gate/create 流程骨架,gateway 路由已映射,Plisio callback(plisio.py:207)和 manual agree(plisio.py:394)也已实现。但创建订单时 wallet_addressweb_url 均为空字符串占位queries.py:514),未调用 Plisio API。

结论: v2 在 crypto deposit 上相比 v1 存在部分回退 — v1 至少能拿到链上地址,v2 连地址也还是占位。需要在 deposit/gate/create 流程中集成 Plisio invoice API 调用。


2.2 Admin Service(替代 admin_server)

v2 admin_service 有约 228 个端点,分布在 12 个路由文件中(从 v1 的 92 个路由文件、约 360 个端点整合而来)。这种整合是有意为之 — v2 使用更少但更大的路由文件,组织更清晰。

统计功能 — 已完成

v2 admin_service/app/api/routes/stats.py 有 19 个端点,覆盖 admin/agent/provider/player/sports/deposit/withdraw/rebate/cashback/lossback/coupon/首充 统计。

v1 中的 /stats/online/stats/admin/home 已合并到 /stats/top 端点中,该端点返回仪表盘汇总数据和 online_players(见 stats.py:90,通过 ping_ts 查询近 5 分钟活跃玩家数)。

可能仍缺少的统计端点(1-2 个):

  • /stats/recalculate / /stats/fix — 统计数据修复工具
  • 体育子统计:/sports/branch/sports/market/sports/parlay(如业务不再需要则可忽略)

玩家管理 — 已完成

以下能力均已在 v2 中实现:

功能v2 位置状态
玩家标签 CRUDplayer.py:327POST /players/{id}/tags
玩家分组管理player.py:713GET/POST /players/groups
玩家 USDT 地址管理player.py:691PATCH /players/{id}/usdt-addresses
玩家注册列表player.py:813GET /players/registrations
Coin deposit init/details/agreeplayer_finance.py:318/406/429
风控分析(重复 IP/多账号)meta.py:139POST /analyzer

仍缺失的玩家管理端点(约 3 个):

  • 玩家等级域名操作(domain/edit、set_primary)
  • 玩家注册审核(audit、tag_players)

活动/优惠券管理 — 大部分已完成

以下能力已在 v2 中实现:

功能v2 位置状态
优惠券搜索promotion.py:571POST /coupon/search
优惠券管理员发送日志promotion.py:660POST /coupon/admin/logs
优惠券玩家使用日志promotion.py:713POST /coupon/player/logs
优惠券发送promotion.py:763POST /coupon/send
优惠券回收promotion.py:316POST /coupon/recycle
活动修改(PUT)promotion.py:954
活动删除(DELETE)promotion.py:984
Deposit/Register/Attendance event 编辑promotion.py:1044/1116/1199

待确认: Excel 批量导入/导出(优惠券模板 Excel 批量发送)

安全与配置 — 已完成

功能v2 位置状态
封禁 PUT/DELETEsystem.py:161/191
IP 黑名单 CRUDsystem.py:208/215/236/263
Banner PUT/DELETEsystem.py:402/426
Lossback 配置 PUT/DELETEfinance_config.py:189/208

待确认: 财务维护(bank/deposit/withdraw 配置编辑)、GGR 统计初始化/重算

基础设施 — 已完成

功能v2 位置状态
WebSocket(/ws/ws/syncmeta.py:309,含 top_info 定时推送
风控分析器meta.py:139POST /analyzer
Vera IP 检查system.py:602POST /vera
Downloads CRUDsystem.py:521/528/549/585
OpenAPI /openapi.jsonFastAPI 默认生成,gateway 已放行(auth.py:46
自定义 meta/schema.yaml 导出v1 有 meta.py:159(自定义 YAML 元数据导出),v2 未迁移缺失(低优先级)

2.3 Game Service(替代 game_server)

供应商回调 — 7 个已完成,SBO 下游未注册

供应商v1v2状态
BTIbti_callback.pybti_callback.py
BT1bt1_callback.pybt1_callback.py
HOho_callback.pyho_callback.py
MGmg_callback.pymg_callback.py
WCwc_callback.pywc_callback.py
Digitaindigitain_callback.pydigitain_callback.py
S+splus_callback.pysplus_callback.py
SBO无独立回调文件无独立回调文件⚠️ gateway 有 /sbo/* 入口(provider_routes.py:106),但 game_service 未注册任何 /sbo 路由(api.py:18),请求会 404

SBO 现状: Gateway 会将 /sbo/* 请求代理到 game_service,但 game_service 的路由注册中没有 /sbo prefix(见 api.py:18),实际请求到达后无对应 handler。需要确认 SBO 是否仍在使用——如果是,需在 game_service 中添加 sbo_callback 路由。

缺失的工具端点 — 低优先级

v1 端点用途v2 状态
POST /games_sync/wc从供应商 API 同步 WC 游戏列表缺失
POST /games_sync/mg从供应商 API 同步 MG 游戏列表缺失
POST /wc/transaction_details查询 WC 交易详情缺失
POST /mg/transaction_details查询 MG 交易详情缺失
GET /mg_games单独列出 MG 游戏缺失

这些是管理/维护工具,非玩家端关键功能。可能是有意省略。


2.4 Agent Service(替代 agent_server)— 已完成

完全功能对等。 所有 40+ 个端点已迁移,仅命名规范化(camelCase → kebab-case)。

唯一显著差异:POST /forget(密码重置)在 v2 中返回 501 Not Implemented


2.5 Wallet / Rolling / Promotion Services(替代 wallet_server)

v1 wallet_server 已拆分为 3 个领域服务。所有核心功能均已实现,且有显著改进

能力v1v2
单一资金写入者部分(wallet_server)强制执行(仅 wallet_service 修改余额)
流水逻辑嵌入 wallet_server独立 rolling_service + FIFO 引擎
活动结算混在 wallet_server独立 promotion_service + saga 模式
事件持久化Outbox + inbox 模式 + 幂等性
可测试性I/O 和逻辑混合纯函数 分离(wallet_ops, rolling_ops, settlement_calc)
跨服务安全直接写数据库幂等键 + 重试

熔断器现状:

  • admin_servicewallet_service/rolling_service:有完整熔断器(_CircuitBreaker
  • game_servicewallet_service:有完整熔断器
  • promotion_servicewallet_service无熔断器,仅薄封装
  • rolling_servicewallet_service无熔断器,仅薄封装

2.6 SMS Server → 共享库(部分迁移)

v1 sms_server 的迁移情况:

  • rgb_contracts.infra.sms 共享库已有可运行的 SmsServicesms.py:38),CoolSMS 发送逻辑已完整实现(sms.py:165,含 HMAC-SHA256 签名)
  • 但 v2 中 player_serviceagent_service 实际调用的是 send_sms(sms_url, ...)sms.py:212),本质上仍是往外部短信网关发 HTTP 请求(见 player.py:345auth.py:369
  • 运行形态仍依赖外部 sms_url 服务,并未完全切换为纯库模式

GS 供应商: v1 的 gs.py 是空文件,gs_utils.py 仅有一个签名工具函数。v1 也未见 GS 的完整实现,因此不算迁移差距。


3. 确认缺失的功能差距

以下是经过逐文件验证确认缺失的功能:

高优先级

差距说明
Docker Composev2 无 docker-compose 部署配置
Crypto deposit 地址分配v1 已调用 Plisio API 拿到 wallet_hash,v2 仍是占位空字符串(部分回退)
SBO 下游路由gateway 有 /sbo/* 入口,但 game_service 未注册 /sbo handler(如 SBO 仍在使用)

中优先级

差距说明
promotion_service/rolling_service 熔断器两个服务的 wallet_client 无熔断机制
玩家等级域名操作domain/edit、set_primary 约 2-3 个端点
玩家注册审核audit、tag_players 约 2 个端点
SMS 调用模式共享库已就绪但实际仍走外部 sms_url,未切换为纯库模式
Cloudflare R2文件上传/存储未实现

低优先级

差距说明
统计修复工具recalculate/fix 端点
体育子统计sports/branch、market、parlay
游戏同步工具WC/MG games_sync、transaction_details
Agent 密码重置POST /forget 返回 501
自定义 meta/schema.yaml 导出v1 有自定义 YAML 元数据端点,v2 未迁移(标准 /openapi.json 已有)
TRON 占位代码应清理以减少混淆
钉钉通知集成引用存在但未完整集成
RocketChat未实现(v1 也很少使用)

待确认(非已证实差距)

项目说明
优惠券 Excel 批量导入/导出核心优惠券功能已全部实现,Excel 支持待确认
财务维护配置bank/deposit/withdraw 配置编辑待确认
GGR 统计初始化/重算待确认
消息定时发送待确认是否已覆盖

4. 架构现状与已知技术债

4.1 数据 ownership 未隔离(已记录在 CLAUDE.md)

所有服务共享一个 PostgreSQL 数据库,通过 rgb_db 共享 ORM:

服务对 Player 表的访问严重程度
wallet_serviceSELECT FOR UPDATE + UPDATE高 — 直接写耦合
promotion_serviceSELECT(text SQL)中 — 读耦合
game_serviceSELECT(ORM import)中 — 读耦合
rolling_serviceSELECT(ORM import)中 — 读耦合
player_serviceOwnerOK

长期方向(见 servers_v2/CLAUDE.md):wallet_service 的写操作应改为通过 player_service internal API,或将余额列拆到 wallet 自有表。

4.2 共享 ORM 耦合

所有服务 import from rgb_db.models.main,形成编译时耦合。给 Player 表加一列就需要重新部署所有服务。

建议:

  • 每个服务应为自己 own 的表定义独立的 SQLAlchemy 模型
  • 对其他服务数据的只读访问应使用 raw SQL 或 HTTP API
  • 这是渐进式迁移,非阻塞问题

5. 优化建议

5.1 高优先级

5.1.1 创建 v2 Docker Compose

问题: 无部署配置。服务必须逐个用 uv run uvicorn 启动。

建议: 创建 servers_v2/docker-compose.yml,包含:

  • 全部 8 个服务 + PostgreSQL + Redis
  • 正确的网络配置(内部服务网格)
  • 每个服务的健康检查
  • 本地开发的 volume 挂载
  • 端口映射对应 servers_v2/CLAUDE.md 规范

5.1.2 恢复 Crypto Deposit 地址分配

问题: v1 wallet_server 在 deposit/gate/create 时已调用 Plisio API 拿到 wallet_hashdeposit.py:659/673),v2 的同一流程仅返回空字符串占位(queries.py:514),属于功能回退。

建议: 将 v1 的 Plisio create_order_by_coin 调用逻辑迁移到 v2 wallet_service 的 deposit/gate/create 流程中,回填 wallet_addresscoin_transaction 表。

5.2 中优先级

5.2.1 熔断器标准化

问题: admin_servicegame_service 的 wallet_client 有完整熔断器。promotion_servicerolling_service 的 wallet_client 仅是薄封装,无熔断机制。

建议: 将熔断器提取为 rgb_contracts.infra.circuit_breaker 共享模块,应用到 promotion_servicerolling_service

5.2.2 SBO 路由确认与实现

问题: Gateway 代理 /sbo/* 到 game_service,但 game_service 未注册 /sbo 路由。

建议: 确认 SBO 是否仍在使用。如果是,在 game_service 中添加 sbo_callback.py 并注册到 api.py

5.2.3 Admin Service 后台任务提取

问题: admin_service 运行 12+ 个后台任务,形成单体式定时任务运行器。

建议: 考虑将定时任务提取为独立的 worker 进程或采用任务队列。

5.2.4 可观测性

问题: 跨服务请求追踪缺少 correlation ID。健康检查模式不统一。

建议:

  • 扩展 /health + /ready 到所有服务
  • 实现 X-Request-ID header 传播
  • 添加带 request_id 上下文的结构化日志

5.3 低优先级

5.3.1 集成测试覆盖

  • admin_serviceagent_service 无集成测试
  • 无跨服务 E2E 测试

5.3.2 清理 TRON 占位代码

admin_service/app/tasks/tron_tasks.py 包含永远不会实现的占位代码,建议删除。

5.3.3 事件 Schema 版本控制

rgb_contracts 中的事件 schema 没有版本字段,建议在 DomainEvent 基类中添加。

5.3.4 配置管理

每个服务独立管理 .env,生产环境建议使用 docker-compose 环境变量或 Vault。


6. 优先级路线图

第一阶段:部署就绪(高优先级)

  1. 创建 v2 docker-compose,包含全部 8 个服务
  2. 恢复 crypto deposit 地址分配(迁移 v1 Plisio API 调用到 v2)
  3. 确认 SBO 是否仍在使用,如是则实现下游路由
  4. 清理 TRON 占位代码

第二阶段:功能补全(中优先级)

  1. 补全玩家管理缺口(等级域名操作、注册审核,约 5 个端点)
  2. 优惠券 Excel 批量导入/导出(如业务需要)
  3. 实现 agent POST /forget 密码重置
  4. 补全游戏同步端点(WC、MG — 如仍需要)

第三阶段:架构优化(中优先级)

  1. 标准化 promotion_service 和 rolling_service 的熔断器
  2. 增加健康检查和可观测性(correlation ID、结构化日志)
  3. 将 admin_service 后台任务提取为独立 worker
  4. 添加 Cloudflare R2 或等效方案用于文件上传(如需要)

第四阶段:长期 DDD(低优先级)

  1. 按服务隔离数据库 schema(从 wallet_service 开始)
  2. 共享 ORM 解耦(每服务独立模型)
  3. admin/agent 服务集成测试覆盖
  4. 跨服务 E2E 测试套件
  5. 事件 schema 版本控制