这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《后端架构设计·高性能与高可用》10.3 故障复盘与改进闭环
实现 arch-lab 的故障复盘记录校验器:时间线、影响面、触发与贡献因素、带 owner 截止日期和验证方式的行动项,以及禁止只写人为失误的规则;用一次明确标注为演练的订单超时事件生成完整记录,并测试拒绝缺 owner、缺验证和只写注意的提交。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
实现 arch-lab 的故障复盘记录校验器:时间线、影响面、触发与贡献因素、带 owner 截止日期和验证方式的行动项,以及禁止只写人为失误的规则;用一次明确标注为演练的订单超时事件生成完整记录,并测试拒绝缺 owner、缺验证和只写注意的提交。
异步任务换线程之后,MDC 里的 requestId 会变成空,ThreadLocal 也读不到;InheritableThreadLocal 只在创建线程时复制一次,线程池复用后照样丢。本节用真实日志展示这三类丢失,给出 MdcExecutor 传递与清理方案,并讨论阻塞 JDBC、orTimeout 不取消上游、异常解包这几个边界。
一次会员借阅详情要查借阅、会员和书目,串行是 600ms,并行是 210ms,但并行不等于无限扇出。本节用 thenCompose 表达两波依赖,用 allOf 合并独立查询,并把每本书一次查询的 N+1 改成一次 findByIsbns 批量查询,最后用信号量把数据库并发压回连接池能承受的范围。
B2B 应用市场的买家是团队,不是个人:决策链更长、安全审查更重、客单价更高。本篇对比 Figma、Notion、Slack、Shopify 四个渠道的 OAuth、上架审核、分成与采购逻辑,并给出一份企业安全审查清单和定价模型。
把首屏、弱网、断线、内存、审核与多端一致写成六条质量属性场景,每条给出刺激、响应、度量口径、预算与证据等级,用风险分级函数排出优先级,明确本卷只验证到 L2、哪些结论必须留给卷三的交易一致性与真机基线,并复盘一次把测试全绿当成质量结论的教训。
「回声」一次能力盘点列出了智能回复、搜索重排、脱敏、退款审批等候选任务,本节用确定性、可验证性、容错成本、数据敏感度四个判据把它们收敛成规则、模型、人工三选一,并附可运行的 TypeScript 判据函数与测试,复盘一次用模型做手机号脱敏导致的漏判事故。
CompletableFuture 不是把 Future 换个名字:thenApply、thenCompose、thenCombine 决定依赖关系,orTimeout 与 exceptionally 决定失败路径。本节用 500ms 任务配 200ms 超时、allOf 单任务失败等输出,说明超时不会取消上游、allOf 会等所有任务结束,再把并行查询接进 libraryd 搜索。
把“低延迟”拆成帧预算、操作预算与结算预算三类互不等价的时间尺度,给出从端到端目标反推排队、处理、持久化与网络分段的预算表,并用 Go 代码把预算检查、分位数统计与超限报告变成可执行约束,最后对比北辰三款产品的预算矩阵,强调长尾而不是平均值。
在 arch-lab 上实现按时间窗口求值的告警引擎:持续条件、for 时长、抑制、去重与分级路由,覆盖 5xx 比例、P99、outbox 积压年龄和库存预留失败率,用测试证明尖刺不告警、持续越线只告一次、下游故障抑制上游,并强制每条规则绑定 runbook。
线程池满了之后,AbortPolicy 只会抛一个 RejectedExecutionException,调用方看到的却是 500。本节把队列深度、活跃线程数和拒绝计数变成可观测信号,用自定义拒绝处理器把过载映射成 503,并讨论 CallerRunsPolicy 为什么会把压力传回 Jetty 请求线程。
用可控网络适配器与假时钟注入断网、慢网、乱序和断线,验证离线排队不产生副作用、重连后按高水位补拉、补拉与实时消息去重、部分响应保留剩余空洞,并复盘一次离线连点把点赞翻回原状的事故,说明每个故障场景的断言,以及为什么 L2 适配器不能替代真实 socket 与真机弱网。
JDK 25 的虚拟线程早已不是预览特性。本节先在同一个 JVM 参数下对比 2000 个平台线程与 2000/100000 个虚拟线程的创建耗时和 RSS,再用 Javalin 7.2.4 的 concurrency.useVirtualThreads 打开虚拟线程,最后用 JFR 确认 synchronized 在 JDK 25 里不再 pin,并说明结构化并发为何仍不进入本卷。
Obsidian、Raycast、Alfred 代表了一类渠道:用户密度高、社区氛围强、目录本身不收费。本篇对比三者的提交与审核机制,拆解社区目录的曝光逻辑、更新节奏和变现边界,帮你在不惹恼社区的前提下把轻量工具做下去。
从北辰工作室三款产品在一次周五晚高峰同时出问题讲起,拆开游戏服务端真正服务的三类对象:玩家、运营与团队;说明有状态、强实时、长会话、玩法耦合四个特殊性如何把普通后端经验推到边界之外,再用房间状态机与状态所有权表落下第一组可验证约束,并给出第一份 ADR。
把发内容、信息流出现、点赞、评论与实时回复串成一条 L2 端到端流程,用内存服务端与真实模块组合,逐步断言信息流、互动关系、评论时间线与未读角标的状态归属,并复盘一次刷新只插新条目、不覆盖旧计数导致的双计事故,说明组合验证能证明什么、不能证明什么。
「回声」把智能回复当成模型演示上线后连续踩坑,本节由此区分模型调用与产品能力,把输入、输出、质量、延迟、成本、失败语义写成六面契约,并用可运行的 TypeScript 类型与测试固定下来,说明为什么能力标识、微元成本、剩余预算和降级原因必须在编码前谈清楚。
libraryd 的阻塞查询不能直接跑在 Jetty 请求线程上。本节用 ThreadPoolExecutor 把核心线程数、最大线程数、有界队列和拒绝策略讲清楚,并用 2 个线程、3 个队列位的饱和实验展示第 5 个任务之后会发生什么,最后把线程池接进 AppMain 与优雅停机。
《游戏服务端架构》卷一《品类、状态与拓扑》全 45 篇的阅读入口:说明本卷要解决的四个问题、十三章结构、北辰三款产品的贯穿案例、序/前言/附录与三条阅读路径,并给出 L1/L2/L3 可运行性口径和 39 篇正文的完整目录。
本篇交代卷一的技术基线、案例构造方式、代码组织与 L1/L2/L3 可运行性口径,说明哪些数字是示例值、哪些是本机实测,以及三款虚构产品为什么要这样设计;同时给出按角色阅读的路径和代码复现方法,便于读者判断每一条结论的证据强度。
在 arch-lab 订单链路上实现 trace_id、request_id、order_id、operation、outcome、error_code、duration 七字段契约、context 传播中间件与契约校验器,用 httptest 真跑创建、支付、失败三条链路验证父子 span,并给出采样率、日志与指标的分工口径。