这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《互联网产品的客户端架构·内容、社交与实时互动》11.2 审核态的内容 UI:占位、隐藏与申诉
审核中的内容最怕先闪正文再被替换。本节用五态状态机描述 draft、pending、review、published、hidden 的可见性与占位,把正文挂载与状态判断绑定,给出 8 条视图投影测试,并复盘一次审核态卡片先渲染正文、随后被占位覆盖的闪烁事故。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
审核中的内容最怕先闪正文再被替换。本节用五态状态机描述 draft、pending、review、published、hidden 的可见性与占位,把正文挂载与状态判断绑定,给出 8 条视图投影测试,并复盘一次审核态卡片先渲染正文、随后被占位覆盖的闪烁事故。
交代卷一的读法:13 章怎样分工、每章的四段式结构、ai-lab 的模块地图与三级验证、Node 26 的代码约定、章间依赖、数字口径与团队用法;另附三个动手练习、自检清单与每章产出物,帮助读者把“会调模型”推进到“能对产品承诺一项能力”。
libraryd 的每个 handler 都在重复读请求头、拼日志、记耗时。本节用 Javalin 的 before/after 把请求 ID、MDC、访问日志和指标收进中间件,并用真实执行顺序说明异常处理器与 after 的先后关系,最后给出请求头信任、MDC 清理与指标基数的边界。
浏览器扩展上架不是把 zip 传上去就结束。本篇按账号、Manifest V3、权限说明、商店素材、审核拒绝、申诉、更新回滚七个环节,拆解 Chrome Web Store 的实际流程,并给出权限说明模板、申诉模板和一份可直接勾选的上架清单。
端上预检只能做早反馈,不能替代审核。本节用纯函数实现长度、格式、控制字符与少量高风险词的本地提示,区分硬阻断、可申诉复核与轻提示三类结果,给出带允许短语、零宽归一化和规则版本的 8 条测试,并复盘一次单字黑名单误拦「黄金周」正常游记的事故。
从《互联网产品的服务端架构》与《互联网产品的客户端架构》结束的地方出发,说明为什么把模型接进产品会变成一个架构问题:能力契约、网关边界、失败语义、降级与计量缺一不可;并交代本卷的四个判断、适用读者、与站内专题的分工,以及代码、版本与数字口径。
libraryd 的服务层已经能借书还书,却还没有 HTTP 入口。本节用 Javalin 7.2.4 把路由挂在配置对象上,接通路径参数、查询参数、分页默认值与 Jackson,并用真实请求验证 201、204、Location、日期序列化和内容类型检查,最后给出完整路由清单。
以 arch-lab 订单系统为例,用实例、可用区、依赖与数据副本的结构化拓扑实现单点检查器,枚举组件、数据与依赖三类 SPOF,计算可用区失效后的容量覆盖与 N+1 剩余容量,并用表驱动测试覆盖单实例、同区双实例与跨区副本等五种典型拓扑案例。
实现订单接口的幂等存储与 Guard:键、请求指纹、PROCESSING/DONE/CONFLICT、结果快照与过期窗口;用故障注入和 -race 真跑并发同键、同键不同参数、处理中崩溃重试与窗口过期,证明重复请求不会二次扣库存或二次支付,并给出存储不可用时的失败关闭策略。
把客户端、网关、服务三层重试建成放大模型,实现指数退避与 full jitter,并在同一故障序列下真跑 1000 个请求:总请求同为 1737、放大 1.737 倍,无抖动重试峰值 495,full jitter 峰值 11;另给出重试预算、幂等前提和不可重试错误清单。
推送不是「有没有」的二值问题:权限被拒、系统通知关闭、令牌失效,三种情况的恢复路径完全不同。本节给出推送降级矩阵、打开应用时的补偿同步策略与「旧推送角标不能覆盖新已读」的规则,并用 TypeScript 实现计划器与角标合并,复盘一次关掉通知的用户永远看不到红点的事故。
在 1.3 的预算分配器之上实现服务端超时中间件:解析请求头预算、设置绝对 deadline、向下游传递扣减后的剩余预算并回写实际耗时;用 httptest 真跑两跳扣减和每跳新建超时的对照,实测 300ms 链路转发 267ms、总耗时 302ms 与 343ms。
同一个「已读」布尔值在两台设备之间一定会打架:甲读完 3 条,乙把整个会话标成已读,新消息到达后两边都显示已读。本节把已读建模为按会话单调前进的位置,用最大位置合并多端状态,处理回执失败重试与服务端总数覆盖,并复盘一次无位置回执把新消息误标已读的事故。
在 arch-lab 订单链路上实现可组合的降级策略链:订单查询按快照、默认值、只读顺序兜底,支付回调把验签、金额、幂等落账列为不可降级步骤,只有下游暂时不可用才进入持久队列稍后重试;用契约测试证明降级响应仍合法、快照落后于已提交版本时必须显式报错而不能掩盖不一致,并给出错误码、用户文案与恢复后的补偿动作。
审计事件要按类型还原,领域对象互相引用又会让 Jackson 无限递归。本节真实复现多态类型丢失、嵌套深度 1002 的报错,并演示如何把事件安全写入 PostgreSQL 的 jsonb 列、再用宽松 mapper 读回,最后给出 libraryd 的 AuditEvent 与仓储写法。
点赞、评论、关注与系统通知四种来源的未读数,为什么不能用一个 total += 1 维护。本节用服务端水位 ackSeq 与事件 id 划清「已计数」和「端上待确认」,给出按类型分组、99+ 上限与幂等合并的 TypeScript 实现,并复盘一次旧快照把角标从 4 覆盖回 3 的线上问题。
领域 record 不是 API 契约:Loan 没有 status 和 overdueDays,请求直接绑定领域对象又会带来批量赋值。本节用 Jackson 真实输出设计 BookDto、LoanDto、PageResponse 与 ApiError,划清请求、响应和领域对象的边界。
把 Chrome、Edge、Firefox、VS Code、JetBrains、Obsidian、Raycast、Figma、Notion、Slack、Shopify、WordPress 放进同一张表,用用户匹配、变现、审核、复用、维护五个维度打分。本篇给出一套可复制的加权评分方法,以及「1 主 + 1 备 + 1 自有」的渠道组合策略。
拉黑是安全操作,端上必须先隐藏再同步:信息流、详情、评论、搜索、私信五处都要在请求发出前生效。本节实现 pending/active/failed 三态 BlockStore、失败不回显的重试、只增不减的服务端快照合并,并复盘一次等确认导致弱网下仍能看到对方内容的事故。
HTTP 层不能靠字符串拼接生成 JSON。本节用 Jackson 2.22.4 真实演示 record 绑定、命名策略、JavaTimeModule 与 ISO-8601 日期,以及 FAIL_ON_UNKNOWN_PROPERTIES 的报错原文,最后把配置收进 libraryd 的单例 JsonSupport。