乐于分享
好东西不私藏

AI聚合平台之六:Token转发后端架构与LLM渠道高可用设计

AI聚合平台之六:Token转发后端架构与LLM渠道高可用设计

刚好今天周末,我们花点时间来聊聊从模块化单体、API/Worker 运行角色、未来微服务边界,到转发实例、共享池、租户独享池、channel 调度、负载均衡和健康监测。

设计之初,主要是下面这2个问题.

第一个问题:后端服务要不要一开始就拆微服务?

第二个问题:LLM 上游不稳定,渠道要怎么做冗余、负载均衡和故障隔离?

这两个问题都和高可用有关,但不是同一层问题。

后端 API 和 Worker 解决的是平台业务复杂度:用户、租户、订单、财务、AI 计费、对账、审计,这些能力怎么在一个可交付的系统里协作。

LLM 渠道层解决的是上游执行复杂度:同一个模型背后可能有多个上游、多个区域、多个转发实例、共享池、租户独享池,平台要怎么选路、限流、降级和恢复。

所以我们当前的架构判断是:

问题
当前设计
为什么
后端业务复杂度
模块化单体 + API/Worker 运行角色
先保证交付效率、本地事务和清晰模块边界
异步和补偿
Worker 承接定时任务、健康检查、对账、异步落账
不把慢任务和可重试任务压在 API 请求线程
未来微服务
service interface、repository interface、outbox、队列抽象、任务状态机
等组织边界和独立交付需求出现后再拆
LLM 渠道冗余
转发实例 + channel + 共享池/独享池 + Route Policy
上游不稳定要在渠道层解决,不靠拆业务服务解决
负载和健康
Redis 实时负载 + health score + Worker 健康任务
只有当前能接流量的 channel 才进入候选池

不想单独纠结讲“单体好还是微服务好”,那句PHP是最好的语言的战争还历历在目。

摆一个更实际的问题,一切从需求出发:

在 AI Token 聚合平台这个阶段,哪些边界应该先做成代码边界和运行角色,哪些边界应该等组织和业务稳定后再拆成微服务。

先把两类高可用分开

如果把“平台业务高可用”和“模型渠道高可用”混成一个问题,后面一定会设计混乱。

平台业务高可用关注的是:

  • API 能不能稳定承接同步请求。
  • 预算、钱包、额度、API Key spend limit 能不能在高并发下守住。
  • Worker 能不能处理异步账单、健康检查、对账、通知、补偿。
  • 模块之间有没有清晰契约,未来是否能拆。

模型渠道高可用关注的是:

  • 同一个公开模型能不能配置多个 channel。
  • 同一个上游路线能不能部署到多个转发实例。
  • 普通用户、平台高级用户、OEM 租户、独享客户能不能走不同池子。
  • 路由时能不能按健康分、实时负载、权重和策略选择。
  • 一个转发实例不可用时,系统是按策略回退,还是明确失败。

这两类问题不能互相替代。

后端拆成微服务,解决不了上游模型区域故障、账号限流、转发实例拥塞。

LLM 渠道做了冗余,也解决不了平台内部账本、租户、订单、对账边界混乱。

平台业务边界和模型执行边界必须分层设计。

为什么当前没有一上来拆微服务

我们早期确实评估过微服务形态:用户服务、订单服务、财务服务、租户服务、AI 服务、通知服务、工单服务等,每个域都可以拆成独立进程。

但从工程现实看,当前阶段不适合这么做。

当前约束
如果过早拆微服务会怎样
业务边界仍在变化
服务边界会频繁调整,跨服务接口反复迁移
团队还没有按业务域形成独立小队
拆服务不会降低协作成本,反而会增加联调和排障成本
用户、租户、订单、财务、AI 计费仍需要频繁联动
本地事务能解决的问题,会被提前变成分布式一致性问题
运行基础设施还要控制复杂度
多服务部署、配置、灰度、监控、追踪、告警都会提前膨胀
很多能力仍处在快速演进期
每次需求变化都可能穿透多个服务,交付速度下降

微服务不是“把代码拆小”。

我一直认为,微服务真正解决的是企业内部组织架构边界问题,而不仅仅是代码边界:

  • 不同团队可以独立交付。
  • 不同业务域可以独立发布。
  • 不同服务可以独立扩缩容。
  • 某个域故障时有清晰责任边界。
  • 数据生命周期和一致性策略可以按业务域独立演进。

如果组织还没有形成这些边界,微服务会先带来成本,而不是收益。

更准确地说:

服务边界不是照抄大厂或者脑补出来的,是内部组织协作和交付节奏长出来的。

当前我们更需要的是一个边界清晰的模块化单体,而不是一组边界还不稳定的微服务。

当前不是“大单体”,而是模块化单体

不拆微服务,不等于把所有代码堆在一个目录里。

我们现在的后端结构是模块化单体:一个应用进程内包含多个业务模块,但每个模块有自己的层次和契约。

一个典型模块内部是这样的:

text

module
  -> handler      只做 HTTP binding、参数校验、响应格式
  -> service      编排业务流程
  -> repository   通过接口访问数据
  -> model        承载领域状态和领域方法

模块之间不应该互相穿透。

比如订单模块需要用到用户能力,它应该依赖用户模块暴露出来的 service interface,而不是直接去访问用户模块内部 repository。

repository 也不是随便查表。多租户场景里,租户上下文必须贯穿到数据访问层。一个用户 ID 本身不够安全,很多查询必须同时受 tenant_id 和资源归属约束。

这套结构带来的收益不是“目录好看”,而是未来可拆。

当前做法
现在的收益
未来拆服务时的收益
service interface
模块间调用可控
可替换成 RPC / HTTP 契约
repository interface
数据访问可测试、可替换
可迁移到独立 DB 或远程 client
handler/service/repository/model 分层
业务规则不散落在入口层
拆服务时迁移边界更清楚
统一错误码和响应 envelope
API 行为一致
网关和服务间协议更稳定
租户上下文贯穿
多租户隔离可证明
拆库或拆服务时边界明确

所以当前的核心不是“单体还是微服务”,而是:

我们先把业务边界做成代码边界、接口边界、事务边界和运行角色边界。等组织边界出现,再把其中一部分提升为服务边界。

API 和 Worker 是运行角色,不是两个业务服务

当前后端只有一个应用入口,但通过运行角色启动成 API 或 Worker。

text

同一套代码
  APP_ROLE=api     -> 启动 HTTP API
  APP_ROLE=worker  -> 启动异步任务和定时任务

这个设计很关键。

API 进程负责同步请求:

API 进程职责
说明
HTTP 接入
对外暴露用户、订单、财务、AI、Admin、OEM 等接口
鉴权和租户上下文
识别用户、API Key、租户、来源策略
请求级门禁
限流、预算预检、模型校验、权限校验
核心事务写入
需要同步完成的状态变更
对外响应
返回前必须能解释本次请求的结果

Worker 进程负责异步和后台任务:

Worker 进程职责
说明
通知投递
外部通道慢且可能失败,不应该占用 API 请求线程
订单超时和履约任务
定时扫描、幂等执行、失败重试
财务任务
账单、统计、对账、补偿
AI 渠道健康检查
定时计算 health score,驱动降级和恢复
转发实例存活检查
定时探测实例可达性,连续失败后降级
异步计费落账
高并发时把钱包、额度、usage log、charge line 从请求线程转移到 Worker
月阶梯计数 flush
Redis 原子计数,后台周期落盘
异步对账
发现卡住的 outbox 或需要人工复核的账单事件

API/Worker 分成两个进程,是为了隔离同步请求和异步任务。

但它们现在还不是两个微服务。

原因很简单:Worker 不是一个独立业务域,它是多个业务域的异步执行面。

订单有 Worker 任务,财务有 Worker 任务,通知有 Worker 任务,AI 渠道也有 Worker 任务。如果把 Worker 简单当成“另一个服务”,就容易出现一个坏味道:同步路径写一套业务规则,异步路径再写一套业务规则。

正确做法是:

API 和 Worker 共享同一套领域模型、repository 契约、配置和基础设施,只是在运行时承担不同职责。

这就是当前 API/Worker 设计的价值。

Worker 的工程价值,不是“异步”两个字

很多系统说自己有 Worker,但只是把一些逻辑挪到后台。

真正有价值的 Worker,需要回答三个问题:

  1. 哪些事情不应该放在 API 请求线程?
  2. 任务失败后怎么重试?
  3. 多个 Worker 实例同时运行时,怎么保证同一件事不会重复执行?

我们现在的 Worker 框架做了几件基础能力。

第一,支持长任务和定时任务。

长任务用于持续消费队列,例如异步计费 outbox。定时任务用于健康检查、对账扫描、月计数 flush、订单超时处理等。

第二,定时任务支持 singleton。

多个 Worker 实例可以水平部署,但某些任务同一时间只能有一个实例执行。比如渠道健康检查、实例存活检查、异步对账扫描,如果多个 Worker 同时跑,可能会重复降级、重复恢复、重复写审计。

所以 Worker 的 singleton cron 会用 Redis lease 做互斥:拿到锁的实例执行,没拿到锁的实例跳过;执行期间续约,退出时释放。

第三,API 和 Worker 之间通过队列抽象解耦。

当前通知链路使用 Redis List 做跨进程桥接,但业务代码依赖的是 Publisher/Consumer 抽象,而不是直接依赖某个具体队列实现。

text

API 侧
  -> Publish(event)
  -> Redis Queue

Worker 侧
  -> Subscribe(topic)
  -> claim / handle / retry

这意味着未来切换到 Kafka 时,不需要重写通知消费者业务逻辑,只需要替换 Publisher/Consumer 的基础设施实现。

第四,异步计费使用 durable outbox。

高并发 AI 请求里,钱包、额度、API Key spend、月阶梯计数都可能成为热行。如果请求线程在上游返回后同步锁这些表,单用户高 QPS 很容易把延迟打爆。

异步计费的方向是:

text

API 请求线程
  -> Redis 原子预算 reserve / pending
  -> 写 durable billing event
  -> 返回响应

Worker
  -> claim pending event
  -> 钱包扣款
  -> 额度扣减
  -> usage log
  -> charge line
  -> API Key spend
  -> 成功标记 posted
  -> 失败进入 retry 或 reconcile_required

这里有两个重点。

一个是 outbox 必须 durable。否则 API 返回成功后,后台没有可靠事件,账本就丢了。

另一个是 Worker 必须幂等。钱包扣款有业务引用,额度扣减有 marker,outbox 有状态机,重复 claim 不应该造成重复扣费。

这才是 Worker 的价值:它不是把慢逻辑“丢到后台”,而是把慢任务、重试任务、补偿任务做成可证明的异步边界。

为未来拆微服务做了哪些铺垫

当前不拆微服务,不代表未来不能拆。

我们真正要避免的是两种极端:

  • 现在就拆,导致每个需求都跨服务联调。
  • 完全不留边界,未来想拆时只能重写。

当前已经做的铺垫可以用一张表概括:

铺垫
当前形态
未来拆分时怎么用
模块契约
service interface
替换成 RPC / HTTP contract
数据访问
repository interface
替换成远程 client 或独立 DB 实现
运行角色
API / Worker
拆成 API 服务、worker 服务、对账服务
异步边界
queue / outbox / job
迁移到 Kafka consumer 或独立任务服务
幂等身份
request_id / event_id / business key
跨服务重试仍然安全
状态机
intent / task / outbox / reconcile 状态
作为最终一致性锚点
审计日志
操作人、原因、状态变化
拆服务后仍能追踪责任
可观测维度
request、tenant、channel、instance
拆服务后变成链路追踪标签

未来如果要拆,不应该按 controller 文件夹拆,也不应该按数据库表名拆。

合理的拆分顺序更像这样:

  1. 先拆运行角色:API / Worker。
  2. 再拆异步执行面:通知、对账、健康检查、异步账单。
  3. 再拆稳定业务域:用户、财务、AI 账本、渠道管理。
  4. 最后再考虑数据物理拆分。

为什么数据拆分放最后?

因为数据一旦物理拆开,事务语义、查询路径、对账方式都会变化。如果业务边界还没稳定,过早拆库会让每一次产品调整都变成数据一致性问题。

什么时候才应该真正转微服务

微服务不是信仰题,而是判断题。

可以用这张 Go / No-Go 表来判断:

条件
适合继续模块化单体
适合拆微服务
团队组织
一个团队维护多个模块
多个团队分别负责不同业务域
交付节奏
模块一起发布可接受
某些域必须独立发布
扩缩容
API 多实例能解决
某个域有明显独立负载峰值
数据一致性
本地事务更重要
可以接受事件最终一致性
故障隔离
实例级隔离足够
某个域故障必须不影响其他域
基础设施
监控、队列、灰度还在演进
服务治理、追踪、告警、灰度成熟

当这些条件没有出现时,拆微服务只是在提前支付复杂度。

当这些条件出现时,模块化单体里已经存在的接口、outbox、任务状态机、审计和可观测字段,就会成为拆分基础。

LLM 渠道高可用,不能靠后端微服务解决

讲完后端 API/Worker,再看 LLM 渠道。

LLM 渠道的不稳定来自执行层:

  • 某个上游账号被限流。
  • 某个区域网络波动。
  • 某个转发实例健康异常。
  • 某个模型路线临时不可用。
  • 某个共享池被大客户打满。
  • 某个 OEM 独享池配置还没完成。

这些问题不是把 API 拆成用户服务、订单服务、AI 服务就能解决的。

正确的边界是:

text

API
  -> 只做平台门禁、预算、路由选择和账本收口

channel
  -> 平台侧流量调度和成本归因单元

转发实例
  -> 上游协议转发和执行入口

Worker
  -> 健康检查、实例探活、路由配置对账、异步账单和补偿

这四个对象的职责不能混。

API 不能变成上游连环重试机器。

转发实例不能变成平台账本系统。

Worker 不能阻塞同步请求。

channel 不能只是 provider key 的别名。

转发实例只做转发

转发实例是一个执行入口。

它可以部署在不同区域,也可以按租户、用户等级、业务场景绑定到不同池子。它要做的是协议转发、上游适配、实例内部 timeout、实例内部 retry、实例内部 provider fallback。

转发实例应该做:

应该做
原因
接收平台选中的执行请求
平台已经完成租户、预算和 channel 选择
按内部路由别名调用上游
屏蔽 provider 之间的模型名差异
处理上游协议差异
让平台侧保持稳定接口
承接实例内部 timeout / retry / fallback
这些属于执行层能力
返回响应、usage 和执行证据
供平台账本和对账使用

转发实例不应该做:

不应该做
为什么
判断客户钱包余额
钱包是平台财务账本,不是执行层职责
判断用户等级折扣
折扣属于计费引擎
判断 OEM 分账
分账属于租户商业模型
写客户 usage log
usage log 是平台客户账本
决定租户能不能走共享池
这是 Route Policy 和租户绑定策略
暴露上游凭证给平台外部用户
凭证必须留在实例和平台内部

转发实例的关键字段也体现了这个边界:

字段能力
架构意义
instance_code
稳定实例标识
base_url
执行入口
auth token encrypted
实例访问凭证加密保存
deploy_region
支持区域化调度
status
active / disabled / degraded
priority
多实例排序
max_concurrency
实例并发上限
health_score
实例健康过滤
pending setup
未完成配置的实例不能接流量

这里的核心原则是:

转发实例越纯,平台越容易替换上游适配层。

如果把钱包、折扣、租户、分账都写进转发实例,未来换转发实现时,等于要重写平台账本。

channel 才是平台的流量调度单元

channel 不是一个简单的 provider key。

channel 表达的是:

text

某个公开模型
  在某个租户范围内
  通过某个转发实例
  使用某个转发路由别名
  以某个权重、并发上限和健康状态
  参与平台调度和计费归因

也就是说,转发实例是执行入口,channel 是平台侧的调度、隔离和归因单元。

关键字段包括:

channel 字段
用途
public_model_name
客户请求看到的模型名
transfer_model_name
转发实例内部路由别名
instance_id
绑定哪个转发实例
tenant_id
空表示共享 channel,非空表示租户专属 channel
weight
负载均衡权重
priority
候选排序
max_concurrency
单 channel 并发硬上限
current_load
展示副本,实时路由以 Redis 为准
health_score
路由健康过滤
currency / cost
上游成本归因
metadata
provider、能力、发布信息

为什么 channel 要承载成本和归因?

因为同一个公开模型可能背后有多个上游路线,成本不同、币种不同、稳定性不同、可用能力不同。

如果只在转发实例里表达这些差异,平台侧就不知道本次请求到底走了哪条商业路径,也无法准确计算毛利、对账和渠道质量。

所以平台账本里必须记录本次选择的 channel、转发实例、路由策略、上游模型名和成本快照。

共享池、租户独享池和混合池

企业级平台不能只有一个“默认上游”。

不同客户会有不同诉求:

  • 普通用户希望成本低、可用即可。
  • 高级用户希望走更稳定的共享高质量池。
  • OEM 租户希望默认走自己的实例池。
  • 大客户希望独享实例和专属 channel。
  • 某个用户或等级需要灰度某条新上游路线。

当前可以用两层配置表达:

text

tenant_llm_bindings
  tenant_id
  instance_id
  binding_type = dedicated / shared_pool / hybrid
  priority
  status

channel
  tenant_id = NULL       -> 平台共享 channel
  tenant_id = 当前租户   -> 租户专属 channel

几类典型场景如下:

场景
转发实例
channel
fallback
直营普通用户
共享转发实例
共享 channel
可在共享池内调度
平台高级用户
高质量共享实例或指定实例
高级 channel
按策略回退
OEM 普通客户
租户绑定实例
租户默认 channel
回到租户默认池
OEM 独享客户
独享转发实例
租户专属 channel
通常不允许共享兜底
单用户灰度
指定实例或指定 channel
灰度 channel
可以禁用 fallback

这里最重要的是最后一列。

共享池不能默认兜底一切。

如果一个 OEM 独享客户买的是独享能力,独享池故障时,系统不应该偷偷把请求打到共享池。短期看成功率提高了,长期看成本、SLA、合规边界都会被破坏。

是否允许共享兜底,必须由策略显式表达。

路由不是 if/else,而是 RouteContext + Route Policy

如果只靠代码里写 if/else,很快就会失控。

比如:

  • 某租户默认走实例 A。
  • 某租户下的高级客户走实例 B。
  • 某个用户灰度新上游 channel C。
  • 图片请求走专门的多模态 channel。
  • chat 请求按共享池调度。
  • 命中特定策略但目标不可用时直接失败。

这些规则不能写死在请求代码里。

我们把运行时路由上下文抽象成 RouteContext:

text

tenant_id
user_id
level_scope = platform_user_level / oem_customer_level / none
user_level_id
public_model_name
request_type

Route Policy 按这些维度匹配:

维度
能表达什么
tenant_id
租户级上游策略
user_id
单用户定向或灰度
level_scope + user_level_id
平台用户等级或 OEM 客户等级
model_code
指定模型
request_type
chat / responses / image / audio 等请求类型
priority
多策略命中时的优先级
specificity
用户级策略优先于等级,等级优先于模型宽泛策略

策略目标有两种:

target_type
含义
channel
直接指定 channel 候选
instance
指定转发实例,再从实例下找匹配模型的 channel

fallback 也必须显式配置:

fallback_policy
含义
disabled
目标不可用直接失败
tenant_default
回到租户默认绑定池
shared_allowed
明确允许进入平台共享池
next_policy
继续匹配下一条策略

这个设计解决的是“灵活”背后的治理问题。

灵活不是随便兜底。

灵活是每个兜底都有策略记录、审计记录和可解释的目标范围。

默认路由:先租户绑定池,再共享池

没有命中 Route Policy 时,系统走默认路由。

默认路由不是简单随机挑一个上游,而是先构建候选池:

text

SelectChannel(tenant, public_model)
  -> 查租户 active bindings
  -> 按 binding priority 构建实例候选
  -> 查实例下匹配 public_model 的 channels
  -> 读取 Redis current_load
  -> 过滤状态、健康、并发、pending setup
  -> 若租户候选为空,再进入 shared pool
  -> weighted least-load 选择 channel
  -> Redis current_load++
  -> 返回 SelectedChannel
  -> 请求结束 ReleaseChannel

候选过滤条件如下:

过滤条件
数据来源
为什么
channel active
DB
禁用 channel 不能接流量
channel health_score >= 50
DB / Worker 更新
低健康分从候选池剔除
current_load < max_concurrency
Redis
不能超过并发硬上限
instance active
DB
禁用实例不能接流量
instance health_score >= 50
DB / Worker 更新
实例不健康时整体剔除
not pending setup
实例配置状态
未配置凭证的实例不能接生产流量

这里要注意:DB 里的 current_load 只是展示副本,路由时以 Redis 为准。

原因很直接。

高并发路由需要毫秒级的实时计数,DB 字段不适合承担这个职责。DB current_load 更适合作为 Admin 面板展示和冷备快照,由 Worker 周期同步。

负载均衡:weighted least-load,不是简单轮询

渠道负载均衡不能只做轮询。

因为不同 channel 的质量、成本、限额和并发能力不一样。

一个 channel 权重高,表示它更适合承接流量。但如果它当前已经很忙,就应该降低它在本轮选择里的有效权重。

当前算法是 weighted least-load:

text

availableSlots = max_concurrency - current_load
effective_weight = weight * availableSlots / max_concurrency

语义很清楚:

  • 负载为 0 时,拿满配置权重。
  • 负载越高,有效权重越低。
  • 达到并发上限,直接从候选池剔除。
  • 如果策略目标带 target_weight,会作为权重乘数叠加进去。

Redis 负载 key 是:

text

ai:channel:load:{channelID}

路由时会批量 MGET 候选 channel 的负载,选中后 INCR。

这里还有一个并发保护:

text

读到 current_load = 99
max_concurrency = 100
两个请求同时选中该 channel
两个请求都准备 INCR

如果没有 INCR 后检查,就可能突破上限。

所以实现里会在 INCR 后再看新值:

  • 如果没有超过 max_concurrency,继续执行。
  • 如果超过,立即 DECR,移除该候选,重选一次。
  • 如果仍然没有可用候选,返回无可用 channel。

请求结束时必须 ReleaseChannel,把 Redis 计数减回去。

Release 使用不低于 0 的 Lua 脚本,避免重复释放导致负载变成负数。同时 key 有 TTL,避免进程崩溃后计数永久残留。

健康监测:Worker 管状态,不塞进请求线程

渠道健康不能靠人工盯。

当前有两类健康治理。

第一类是 channel / instance 的运行窗口健康分。

当前执行器会把平台选中的成功调用写入 Redis 分钟级 bucket。窗口读取器本身按 ok / total 聚合,后续如果要把更多失败样本纳入同一窗口,不需要改健康任务的状态机。

Worker 每 60 秒读取最近窗口,计算 health score,并把结果写回 channel 和实例记录。

简化后的模型是:

text

success_rate = ok / total
health_score = success_rate * 100

状态机是:

条件
行为
score < 30 首次出现
写 degraded 计时 key
score < 30 持续 3 分钟
系统自动降级
score > 70 首次出现
写 recovering 计时 key
score > 70 持续 5 分钟
系统自动恢复
Admin 手动禁用
不自动恢复
低分后无流量
可重置,避免低分无流量导致永远无法恢复

第二类是转发实例存活检查。

Worker 每 60 秒探测转发实例的 liveliness endpoint。连续失败达到阈值后,实例进入降级;连续成功达到阈值后,降级实例恢复。

这类检查解决的是实例入口本身不可达的问题,和 channel 的业务流量窗口不同。

所以这里有两个层次:

健康对象
解决的问题
channel health score
某条模型路线在平台侧是否适合继续接流量
instance liveness
某个转发实例入口是否可达

两者都由 Worker 维护,而不是塞进 API 请求线程。

原因是健康检查本质上是周期性治理,不应该让用户请求承担扫描、降级、恢复、审计和告警的成本。

同模型多上游怎么配置

同一个公开模型,可以对应多个 channel。

例如:

public model
channel
转发实例
转发路由别名
作用
model-a
channel-a-east
instance-east
route-a
上游 A 东区
model-a
channel-a-west
instance-west
route-a
上游 A 西区
model-a
channel-b-east
instance-east
route-b
上游 B 东区
model-a
channel-b-west
instance-west
route-b
上游 B 西区

对客户来说,请求的都是 model-a

对平台来说,每个 channel 有自己的:

  • 租户范围
  • 权重
  • 并发上限
  • 健康分
  • 成本价
  • 上游模型名
  • 转发实例
  • 路由策略归因

这才是真正可运营的同模型多上游。

这里还有一个重要取舍:

平台层不会在一次请求失败后跨 channel 连环重试。

平台先选择一个 channel,本次请求的 usage、成本、健康、证据都归属这个 channel。

provider 级 retry 和 fallback 应该属于转发执行层的内部路线能力。否则平台层 A channel 已经产生上游成本,再切到 B channel 成功,账本和证据归属会非常难解释。

简单说:

text

平台层:
  选择一个 channel
  记录本次请求归因
  完成账本收口

转发执行层:
  在选定路线内部处理 provider retry / fallback

这个边界看起来保守,但对账、毛利和争议处理会稳定很多。

API / Worker 和渠道架构如何配合

把两条主线合起来,可以得到这张架构图:

text

Client / SDK
    |
    v
API 进程
  鉴权 / 租户 / 预算 / 模型门禁
  构建 RouteContext
  调用 Route Policy + RoutingService
    |
    v
SelectedChannel
  channel_id
  instance_id
  route_policy_id
  cost snapshot
    |
    v
转发实例
  执行上游协议转发
  返回 response / usage / evidence
    |
    v
API 收口
  usage log / charge line / budget commit
    |
    v
Worker
  健康检查 / 实例探活 / 异步账单 / 对账 / 补偿

这张图里,每个对象都有自己的边界:

架构层
做什么
不做什么
API 进程
同步请求、门禁、预算、路由选择、响应收口
不做后台扫描和跨 channel 连环重试
Worker 进程
健康检查、实例探活、异步账单、对账、补偿
不阻塞用户请求
Route Policy
决定候选池、租户/用户/等级策略、fallback 语义
不直接调用上游
channel
平台侧调度、隔离、成本和归因
不保存上游凭证
转发实例
上游协议转发和执行层重试
不写客户账本

真正稳定的架构,不是每层都能做所有事,而是每层只做自己该做的事。

常见错误设计

第一种错误:业务还没稳定就拆微服务。

结果是服务边界天天变,跨服务联调、数据一致性、配置发布先爆炸。

第二种错误:把 Worker 当成另一个服务随便写业务逻辑。

结果是同步路径和异步路径各写一套规则。等需要补偿和对账时,没人能证明两套规则一致。

第三种错误:把转发实例做成业务系统。

一旦转发实例里写了钱包、租户、折扣、OEM 分账,平台账本和执行层就耦死了。未来想换上游适配层,成本会非常高。

第四种错误:channel 只是 provider key 的别名。

如果 channel 不能表达租户范围、权重、并发、健康、成本和归因,它就不是调度单元,只是配置项。

第五种错误:独享池不可用时自动回共享池。

短期成功率变高,长期破坏成本、SLA 和合规边界。能不能回共享池,必须由策略显式决定。

第六种错误:用 DB current_load 做实时路由。

高并发路由需要实时原子计数。DB 字段适合展示,不适合承担毫秒级调度。

第七种错误:平台层 A 主 B 备跨 channel 重试。

一旦 A 已经产生上游成本,再切到 B 成功,账本、usage、provider evidence 会变得很难对齐。

架构检查清单

如果你也在设计 AI Token 聚合平台,可以用这张清单自检。

API / Worker:

  • 是否有统一应用入口,并通过运行角色区分 API 和 Worker。
  • API 是否只承接同步请求和必要强一致操作。
  • Worker 是否承接定时、异步、补偿、对账、健康检查。
  • 模块之间是否通过 service interface 调用。
  • 是否避免跨模块直接访问 repository。
  • Worker 任务是否有业务唯一键和幂等保护。
  • 队列和事件是否有抽象接口,未来可替换基础设施。
  • 哪些模块未来可以拆服务,边界是否已经能描述。

微服务拆分:

  • 是否已经有独立团队负责独立业务域。
  • 是否需要独立部署、独立扩缩容。
  • 是否能接受事件最终一致性。
  • 是否已经有服务治理、链路追踪、告警和灰度能力。
  • 数据归属是否清楚。
  • 失败补偿和幂等机制是否成熟。

LLM 渠道:

  • 转发实例是否保持纯执行层职责。
  • channel 是否承担平台调度和归因。
  • 同一个 public model 是否可以配置多个 channel。
  • channel 是否可以绑定不同转发实例和区域。
  • 是否支持共享池、租户独享池和混合池。
  • 是否有 Route Policy 表达租户、用户、等级、模型、请求类型。
  • fallback_policy 是否显式控制共享池兜底。
  • 负载均衡是否使用实时 current_load。
  • health_score 是否由 Worker 根据运行窗口更新。
  • Admin 手动禁用是否不会被自动恢复覆盖。

结尾

这篇文章的核心判断是:

AI Token 聚合平台当前更适合用 API + Worker 的模块化单体承载业务复杂度,同时把 LLM 渠道高可用独立建模为转发实例、channel、共享池、独享池、Route Policy、负载和健康治理。

微服务不是架构起点。

微服务是组织、业务和基础设施发展到某个阶段后的结果。

在那之前,更重要的是把边界先做对:代码边界、运行角色边界、异步边界、账本边界、渠道边界。

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-14 14:21:28 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/747891.html
  2. 运行时间 : 0.129073s [ 吞吐率:7.75req/s ] 内存消耗:4,822.08kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=ec9d6eb6a7982b3af3aa74c824068044
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000603s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001084s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001832s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000450s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000603s ]
  6. SELECT * FROM `set` [ RunTime:0.000243s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000700s ]
  8. SELECT * FROM `article` WHERE `id` = 747891 LIMIT 1 [ RunTime:0.000772s ]
  9. UPDATE `article` SET `lasttime` = 1781418088 WHERE `id` = 747891 [ RunTime:0.016406s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.005449s ]
  11. SELECT * FROM `article` WHERE `id` < 747891 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000630s ]
  12. SELECT * FROM `article` WHERE `id` > 747891 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000540s ]
  13. SELECT * FROM `article` WHERE `id` < 747891 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000849s ]
  14. SELECT * FROM `article` WHERE `id` < 747891 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000757s ]
  15. SELECT * FROM `article` WHERE `id` < 747891 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.011995s ]
0.131571s