这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《后端架构设计·高性能与高可用》6.2 熔断状态机与恢复策略
在 arch-lab 支付下游实现 closed/open/half-open 三态熔断器:用时间滑窗成功率与慢调用率触发打开,半开阶段限制并发探测配额并在探测失败时立即重开;给出并发状态迁移测试、20 并发只放 3 个探测的真实输出,以及支付链路阈值、误熔断代价和强制打开/关闭的运维入口。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
在 arch-lab 支付下游实现 closed/open/half-open 三态熔断器:用时间滑窗成功率与慢调用率触发打开,半开阶段限制并发探测配额并在探测失败时立即重开;给出并发状态迁移测试、20 并发只放 3 个探测的真实输出,以及支付链路阈值、误熔断代价和强制打开/关闭的运维入口。
两个借阅请求同时通过「没有活动借阅」检查时,应用层的先查再插并不安全。本节用两个 JDBC 连接真实复现部分唯一索引冲突、条件更新幂等归还与死锁 40P01,并给出 libraryd 借阅、归还和批量写的最终写法,说明为什么 synchronized 在多实例下无效。
可见性规则在端上只能表达为提示与预判,最终仍以服务端为准。本节把公开、关注可见、好友可见、仅自己可见映射为带置信度的预判,给出可测试的首屏骨架、服务端纠正、拒绝后清理缓存与受众提示的完整实现,并复盘一次预判过宽导致缓存标题与封面提前泄露的事故。
独立开发者最常见的错误,是把分发留到最后一步。本篇用两个复合案例说明:渠道会反向决定产品形态、权限、定价与技术栈;并给出一张可填写的渠道-形态匹配表,帮你在写第一行代码前先确认产品能被哪个平台接住。
两个连接同时读写 loans 时,read committed 与 repeatable read 到底差在哪?本节用真实 PostgreSQL 输出拆开语句快照与事务快照,观察 xmin/xmax 与行锁等待,并给出 libraryd 报表查询与可重试事务的落地写法。
关注、粉丝与互关不是一张布尔表:方向、新鲜度和进行中的变更都要分别记录。本节用带假时钟的 FollowCache 实现四态关系缓存、TTL 降级、乐观关注与回滚,给出关系变化后的列表失效矩阵,并复盘一次把缓存互关当成私信授权、导致错误入口的事故。
libraryd 的一次借阅要写会员和借阅两条 SQL,JDBC 默认的自动提交会让失败只回滚一半。本节用真实 PostgreSQL 演示 autoCommit=false、commit、rollback 与保存点,把事务边界收在服务方法上,并解释 25P02 与连接归还问题。
在 arch-lab 订单链路上实现令牌桶与精确滑动窗口限流器,用注入时钟重放同一到达序列,对照放行数、突发容忍与窗口误差;再实现带 TTL 的分布式租约,用确定性模拟量化时钟漂移造成的配额浪费、拒绝率与跨实例不均,并给出下单、支付回调的限流参数与运维边界。
在 arch-lab 下单链路实现带 deadline 的调用包装、在途取消与慢调用统计,用 240 个请求和 300ms 慢下游真实复现“连接堆积→队列打满→上游超时”:修复前 240 次网关超时、96 次提交阻塞,修复后均为 0,并给出网关、服务、下游三层指标与取消边界。
在 arch-lab 订单服务上给库存、支付、通知三个下游分别实现信号量舱壁与令牌桶配额,用真实测试证明支付被拖慢时库存与通知仍在 18ms 内完成,并给出按 Little 定律计算并发配额、OVERLOADED/RATE_LIMITED 错误码与舱壁过小的退出条件。
在线状态一旦涉及隐私,就不再是「显示什么」,而是「允许谁看到什么证据」。本节把可见性、关系、拉黑与连接降级组合成一张展示决策表,明确 unknown 与 offline 的差别,给出可运行实现与测试,并复盘一次隐藏在线后仍能从活跃时间反推的事故。
在 arch-lab 订单服务上实现有界工作池与连接池租约模型:队列上限、等待超时、三种拒绝策略、在途与排队指标、泄漏检测;用 1200 个任务真实对比 1/4/16/64 个 worker 的吞吐与排队,并给出 Java 21 线程池对照、本机命令与原始输出。
输入中状态不是一次事件,而是一份几秒后自动过期的租约。本节用本地节流、远端超时、会话隔离与停发条件,把「正在输入」压成低频心跳,给出丢包、乱序、进程被杀与幽灵输入四类故障下的可运行实现与假时钟测试,并复盘一次每键发送导致群聊广播风暴、指示器随机闪烁的事故。
以 arch-lab 订单事件流为例,实现按 order_id 分区的顺序消费、积压年龄指标、重试上限后进入 DLQ、修复后重放,以及带窗口与 grace 的定时对账,覆盖乱序、毒消息和缺失事件测试,并给出 30s/2min 告警阈值与对账口径,附本机真实输出。
列表页、批量导入和借阅详情会把数据访问层的问题放大。本节实现 LIMIT/OFFSET 分页与总数统计,比较逐条插入、addBatch 和 reWriteBatchedInserts 的真实耗时,并用一次 JOIN 消灭活动借阅列表里的 N+1 查询。
客户端看到的「在线」不是事实,而是一次带衰减的观测。本节把 presence 拆成最后活跃时间、online/away/offline/unknown 四态与 TTL 过期,给出窗口判定、下一次转换时间与最后活跃文案的纯函数实现,并复盘一次把 socket 连通当成在线、导致用户对着「幽灵在线」发消息的事故。
小数据量下所有查询都很快,索引问题要等到十万行才暴露。本节用 EXPLAIN (ANALYZE, BUFFERS) 对比 Seq Scan、Index Scan 与 Bitmap Index Scan,给 libraryd 的模糊搜索和活动借阅补上 pg_trgm GIN 索引与部分索引。
重连后只拉最新一条,会让中间的缺口永远补不上。本节用已收序列号维护连续高水位,按批生成补拉区间,把补拉结果与实时推送合并去重,并复盘一次「重连只同步最新消息」导致的历史消息永久丢失,说明补拉报告如何表达未完成状态,以及服务端历史过期后端上必须承认的边界。
数据库 schema 是 libraryd 的最终契约,也是应用层之外的最后一道校验。本节逐条解释 V1__init.sql 里的三张表、主外键、检查约束和部分唯一索引,并用真实插入失败验证每条规则挡住的是什么错误,以及哪些规则不该交给应用层,哪些又必须留给数据库。
以 arch-lab 通知消费者为例,实现 message_id 去重表、PROCESSING 租约与 DONE 终态,覆盖重复投递、并发重复和处理中崩溃后重试,并说明恰好一次在业务层的真实含义、去重窗口与代理重投窗口的边界,附本机 -race 真实输出。