feat(proxy): 架构与算法优化二轮——sense 运行时单例激活 T-X3、打码密钥泄漏修复、账本热路径 2.4x

- gateway/proxy/routes.py:sense 运行时(SenseStore+Grader+晋升表)按配置单例化,
  原每请求重建导致:每请求跑全量 DDL、重读工件文件,且 T-X3 60s 决策缓存随
  Grader 丢弃、命中率恒为 0(本轮最大收益,激活既有已测组件);
  T1 审计抽样修复原 NameError×3 被 except 吞掉(load_config/get_review/request_id
  均未定义、§9.4 从未入队)——request_id 上提、review 队列经 review_getter 注入
  (api.py 反向依赖解除)、sample_rate 走 load_config
- gateway/model_pool.py:新增 usable_entries() 未打码内通道;routes 的降级链/
  预算降档/能力位重定向/档位映射四处改走该通道——修复打码 api_key 流入上游
  Bearer 头导致带密钥条目重定向必 401 的隐性缺陷(HTTP 管理面仍用打码 list())
- gateway/proxy/ledger.py + billing.py:共享持久连接(原每操作新建,全链路
  每请求 3-5 次 connect)+ 日重置 UPDATE 每实例每日一次短路(原每请求全表扫描
  抢写锁);check_and_count A/B 0.75→0.31 ms/op(2.4x);新增 usage_stats()
  SQL 聚合,/admin/stats 从 list_usage(limit=50 万) Python 四遍扫描改为下推聚合
  (微基准 ~28x,随流水线性扩大)
- gateway/sense/grader.py:决策留痕 insert_decision 移入 asyncio.to_thread
  (原同步 sqlite 写直接跑在事件循环线程,高并发阻塞网关;与观察写批量队列同等保护)
- 全量 474 项两轮复核全绿(基线 474)
This commit is contained in:
tzt
2026-09-18 23:59:44 +08:00
parent 781f8aaadf
commit e00e2cd2b1
6 changed files with 156 additions and 49 deletions
+33
View File
@@ -179,6 +179,39 @@ class BillingMixin:
(request_id,)).fetchone()
return dict(row) if row else None
def usage_stats(self) -> Dict[str, Any]:
"""全局流水聚合(§5.2 看板口径,2026-09 优化:SQL 下推替代全量拉取)。
返回 {requests, gateway_cached, in_hit_tok, in_miss_tok, revenue_milli,
cost_milli, by_bucket}by_bucket 键为 bucket 名。
"""
with self._lock, self._connect() as conn:
row = conn.execute(
"SELECT COUNT(*) AS requests,"
" COALESCE(SUM(gateway_cached), 0) AS gateway_cached,"
" COALESCE(SUM(in_hit_tok), 0) AS in_hit_tok,"
" COALESCE(SUM(in_miss_tok), 0) AS in_miss_tok,"
" COALESCE(SUM(charged_milli), 0) AS revenue_milli,"
" COALESCE(SUM(upstream_cost_milli), 0) AS cost_milli"
" FROM usage_ledger").fetchone()
buckets = conn.execute(
"SELECT bucket, COUNT(*) AS requests,"
" COALESCE(SUM(charged_milli), 0) AS revenue_milli,"
" COALESCE(SUM(upstream_cost_milli), 0) AS cost_milli"
" FROM usage_ledger GROUP BY bucket").fetchall()
return {
"requests": row["requests"],
"gateway_cached": row["gateway_cached"],
"in_hit_tok": row["in_hit_tok"],
"in_miss_tok": row["in_miss_tok"],
"revenue_milli": row["revenue_milli"],
"cost_milli": row["cost_milli"],
"by_bucket": {r["bucket"]: {"requests": r["requests"],
"revenue_milli": r["revenue_milli"],
"cost_milli": r["cost_milli"]}
for r in buckets},
}
def list_usage(self, student_id: Optional[int] = None,
limit: int = 50, offset: int = 0) -> List[Dict[str, Any]]:
"""流水分页(可按学生过滤,经其名下 key);按学生过滤走联表常量语句。"""