软件架构考试之夜提供了证据,不是容量保证——NovaCommerce 第五篇
两场真实考试、一次缩容失误和一个规划模型。最后一篇把观察、外推、运维成本与尚欠测试分清楚。
每天100,000单是业务目标,不是服务器配置。把流量转换成高峰工作,解除实测瓶颈,并验证故障状态下的容量。
作者
Anichur Rahaman

日订单翻倍,老板希望服务器也翻倍。但结账只在商品导入、财务报表和午间高峰重叠时变慢。添硬件可能有用,也可能掩盖不合理查询、连接池耗尽或内存争抢。这是教学场景,不是观察到的客户案例。
有用的路线图把业务承诺与实测工作连接起来。同样100,000单/天,可以是全天均匀分布的全球业务,也可以是短时集中售卖。没有一个通用订单门槛要求必须买某种CPU、单独部署Redis或管理服务器集群。
已接受订单、结账尝试、访客、动态请求、数据库事务和后台任务是不同数量。未购买访客、重复请求、导入、webhook、报表和昂贵搜索也要纳入。CDN直接响应的静态资源走另一条路径。转化率与每次访问的请求数可能先于订单发生变化。
以下是示例模型,不是基准测试。100,000单/天除以86,400秒,平均约1.16单/秒。假设全天所有客户流量,包括不购买者,按每个已接受订单折算20个动态源站请求,共2,000,000请求/天,约23.15请求/秒。这不是说每个买家恰好发出20次请求。
若这些请求的15%集中在15分钟,则300,000÷900≈333.33请求/秒,一秒级尖峰可能更高。同一稳定区间内平均请求停留时间若为0.24秒,平均约333.33×0.24≈80个请求在途。不是80个CPU核心、PHP进程或数据库连接。必须使用相同边界及平均值,不能用p95替代这里的均值。

定义业务旅程:能否预留正确规格、获得正确总额、完成所选支付流程并取得持久订单编号?与业务方约定延迟、错误及数据新鲜度目标。结账800毫秒或数据库CPU60%不是通用合格线。快速返回错误不等于成功购买。
把分路由p95/p99、错误及超时、实际业务结果,与进入系统的需求和接受吞吐一起观察。相应分母应包括失败尝试。再看CPU限流、进程内存和OOM、磁盘延迟和空间、数据库连接等待、锁及慢查询贡献,以及队列处理率、重试和最老就绪任务年龄。未来才到期的任务不一定逾期。把慢结账与真实等待的资源或依赖对应起来。
如果实测工作量和停机风险允许,一台主机可以是合理起点;从一开始使用托管数据库也可能合理。两者都不强制。为所有进程而非仅Web分配内存、CPU、存储、备份和运维访问。后台及周期任务需要监管;临时终端里启动进程不是可靠运维。
PHP-FPM文档说明并发请求的进程限制。按实测进程内存、共享开销、CPU和下游能力设定。增加进程可能耗尽内存或连接。OPcache减少重复编译,但预加载有自己的生命周期,不保证提速50%。验证实际启用行为、内存和版本失效。增加可能过期或跨范围泄露的缓存前,先分析重复查询及每请求工作。
导入、图片、报表或AI任务反复影响结账时,隔离资源预算或迁移到独立进程池/主机。给关键工作容量与有限重试。唯一worker已在处理长任务时,优先级不能自动抢占。某些结账决策必须在接受前保持一致;放进队列不取消业务约束。明确的待处理状态与虚报成功不同。
拆数据库可改善资源隔离,也增加网络、安全、备份和监控责任。缓存、会话及队列服务要按真实用途决定持久化、淘汰和可用性。Laravel说明受支持的调度与协调方式。调度器最低512MB或单一常驻进程不是通用疗法。选择受支持执行模式并防止无意的周期任务重复。
多Web节点需要共享或适当复制的会话、持久上传及兼容的版本配置。不可在随时销毁的节点上保存业务数据唯一副本。仅缓存合适响应,键覆盖主机、租户、语言及其他表示维度。除非证明隔离,否则私密或设置会话的响应不进共享缓存。缓存未命中和集中失效仍需受控重建能力。
PgBouncer不同池模式有不同语义。事务池可降低后端连接压力,但应用必须兼容会话特性和预编译语句配置。它不会创造数据库执行能力。把Web、worker、报表、迁移及管理连接合并预算;提高上限前看池等待与数据库饱和。
副本适合允许一定陈旧的读取,不适合所有当前库存或支付决策。PostgreSQL流复制默认异步,可能滞后;重型副本查询会与恢复冲突,复制本身也消耗资源。只读副本不自动等于安全故障切换或独立备份。只有实测需求和运维成本支持时,才单独扩展渲染、搜索或分析。服务端渲染可能就在实时请求链上,不一定是后台工作。
在获授权环境使用类似生产的数据规模、索引、热门规格、缓存状态、第三方延迟和后台任务。由小到大增加需求,持续并测试突发,设明确停止条件。保护个人数据,禁止真实扣款、客户邮件和发货。记录构建、配置及未覆盖范围。
Grafana k6区分开放与封闭负载模型。固定用户测试在响应变慢时可能减少发送量,未必代表抢购到达流。按到达率测试时保证生成器能力,并查看被丢弃的迭代和实际请求指标。迭代是脚本旅程,不一定一个HTTP请求或一笔订单。一起报告计划到达、实际吞吐、业务结果和等待工作,不能只展示丢负载之后好看的延迟。
测试计划的降级状态:一个Web节点不可用、服务商变慢、冷缓存或worker重启。单台不能承受必要负载,两台也不够故障容量。增加Web进程可能让数据库争抢更严重。每次改变一个有依据的约束,重跑同一有效测试并保留对比。首页测试不能给出通用100,000单认证。
业务按实际影响选择可接受的可恢复数据缺口和服务恢复时间,即RPO/RTO,而不是按订单档位套用。夜间计划dump不能单独保证最多损失24小时;任务可能失败、归档不全或备份不一致。验证真实可恢复点及完整业务恢复。复制也会复制删除,不能替代受保护的历史保留。
保留兼容发布、有限优雅交接和演练过的恢复决策。蓝绿路由不会逆转破坏性迁移或完成的支付。不要无差别清空共享会话、锁或活动版本文件。参阅安全发布指南与恢复演练指南。下方既有视频展示界面,不证明你的环境能够恢复。
表格给的是决策关口,不是固定订单区间。合计计算、存储IO、副本、媒体和出站流量、监控、备份恢复、备用容量及工程值守成本。故障路径未经测试的廉价服务器可能运营昂贵。组件越多,版本、凭据和恢复程序也越多。
对开头的店铺,先确认午间延迟来自报表、导入、连接等待还是其他依赖。隔离已证实争抢,重跑相同混合旅程,核对订单、库存和支付结果一致。下一次采购应跟随证据,而不是某个机器配置保证所有店铺达到同样日单量的承诺。
StoreConsole受支持的基础要求请看系统要求及安装文档,再验证实际启用模块、扩展和运维配置。支持的最低条件不是容量基准。保存测试证据,并指定下一轮复核负责人。
| 决策阶段 | 改变原因 | 验收证据 |
|---|---|---|
| 简单且有运维的运行环境 | 负载可容纳,故障风险已理解 | 混合旅程测试、限制监控、成功恢复备份 |
| 隔离资源争抢 | 报表、导入或任务伤害关键路径 | 相同测试改善;成本和负责人明确 |
| 冗余与横向扩展 | 可用性或实测容量需要更多节点 | 共享状态及降级、发布测试通过 |
| 专业化运营 | 搜索、分析、AI或数据有独立约束 | 一致性、延迟、保留、成本及恢复可接受 |
复核于2026年11月5日。Anichur Rahaman是StoreConsole创建者。速率和场景为教学示例,不暗示硬件档位或容量保证。
作者简介
Anichur Rahaman
继续阅读