Files
pj_service_cloud/docs/create-order-payment-timing.md
T
2026-10-23 16:07:22 +08:00

59 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 消费机创建订单分段耗时
外部接口 `/hard/hard-api/ad/create-order` 对应 hard 服务内部
`POST /hard-api/ad/create-order`。本次诊断仅观察该请求,不改变请求协议、
事务注解、分布式锁、支付顺序、重试和返回值。
## 日志策略与开销
- 通过 `System.nanoTime()` 和请求内存中的阶段表计时,不新增 SQL、Redis 或 Feign 请求。
- 正常且小于 1 秒的请求不新增摘要;慢请求、失败及阶段内被业务处理的异常输出一条 warning。
- 摘要在过滤器链返回或抛错后统一生成,不在扣款写事务中逐阶段输出日志。
- 专用 Logback 异步队列容量为 256,`neverBlock=true`。队列满时丢弃诊断摘要,不等待落盘。
- 使用已有 `debug.log` 文件;不写入 DTO、人员资料、金额、令牌、付款码、图片或异常消息。
计时与内存分配存在少量开销,不能承诺零开销。异步队列优先保障请求返回,
日志管道持续拥堵时可能缺少部分诊断记录。
## 取日志与匹配
部署包含 Java 代码和 `logback-spring.xml` 改动的 hard 服务后,在 `debug.log`
搜索 `|终端支付耗时|`。按 `androidOrderCode` 与消费机的 `|支付耗时|` 摘要、
原有订单 SQL 对齐;同号重试可通过不同的 `trace` 区分请求。
`outcome:failed` 是请求未正常完成,不能单凭这一字段判断钱包是否已经扣款;
仍需按原有订单对账逻辑确认。旁路通知或证据登记异常被业务自行处理时,
请求可能保持 `outcome:success`,异常类型保存在 `stageErrorTypes` 中。
## 主要阶段
| 字段 | 范围 |
| --- | --- |
| `pre_controller` | 请求监听器开始至 Controller 进入,含期间租户检查、认证、解析及校验 |
| `controller` | Controller 参数整理、Service 调用和返回对象创建 |
| `redis.lock` / `redis.unlock` | 原有 Redis 加锁、持锁检查及解锁 |
| `idempotency.lookup` / `idempotency.validate` | 原订单查询及重复请求一致性校验 |
| `prepare` | 下单准备整体,含下面的远程及本地查询 |
| `prepare.merchant` / `prepare.hardware` | 商户远程查询、设备本地查询 |
| `prepare.user` / `prepare.wallet` / `prepare.cart` | 用户、钱包及商品计价准备 |
| `transaction` | 原有代理事务调用,包含事务开始、提交及同步 afterCommit |
| `db.cart` / `db.orderInsert` | 购物车和订单写入 |
| `wallet.debit` | 原有钱包扣款远程调用 |
| `db.orderPaid` / `db.cartPaid` | 已支付状态更新 |
| `afterCommit.evidence` | 原有同步人脸证据元数据登记 |
| `postCommit.notify` | 原有提交后打印/播报分支 |
`stagesInclusiveMs` 单位为毫秒,父阶段包含子阶段,不能直接相加。
其他支付方式仍按原逻辑执行,日志可出现核销、库存及第三方支付阶段。
## 时间边界
监听器在 Servlet 过滤器之前记录起点,专用过滤器在原有租户过滤器之后、
安全过滤器之前绑定请求追踪,不调整已有过滤器顺序。
若请求在更早的租户过滤器中直接拒绝,尚未进入计时过滤器,则不会产生本摘要。
`totalMs` 截止过滤器链返回,不是客户端端到端耗时;不覆盖网关和入站网络、
容器调用请求监听器前的排队、最后的响应传输,以及客户端本地处理。
因此“客户端 4500ms、服务摘要 200ms”只能证明还需排查摘要计时区间之外的等待,
不能直接认定为 Flutter 程序卡顿。