这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《互联网产品的服务端架构·产品、流量与基础能力》5.1 App、Web 与小程序的差异
从「回声」小程序复用 App 未读模型的事故写起,把 iOS、Android、Web 与小程序的登录态、推送、深链、包体上限差异整理成一张能力表,并用一段可测试的 Go 代码说明 BFF 为什么必须按端裁剪,以及未知端为什么不能默认兜底,避免同一个接口把强端和弱端一起拖死。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
从「回声」小程序复用 App 未读模型的事故写起,把 iOS、Android、Web 与小程序的登录态、推送、深链、包体上限差异整理成一张能力表,并用一段可测试的 Go 代码说明 BFF 为什么必须按端裁剪,以及未知端为什么不能默认兜底,避免同一个接口把强端和弱端一起拖死。
从「回声」用户注销后仍能在备份里找回账号的事故说起,说明 pending、deleted、purged 三态注销机如何约束导出、删除、备份清除和审计留痕的时序,给出拒绝提前清除、校验备份窗口的 Go 实现与状态测试,并讨论日志、备份和审计记录里残留个人信息该怎么收尾。
从「回声」注册页多收的一个手机号说起,说明公开、内部、敏感三级字段如何按注册、推荐、客服、风控四个目的裁剪,给出保持输入顺序、拒绝负数保留期的 Go 最小化函数与测试,并拆解全量采集在注销、日志、第三方 SDK 和备份上留下的实际代价与审计缺口。
以「回声」个人主页上线三天后的一次手机号字段泄露为入口,拆解公开、好友、自己三档可见性,讨论好友的好友、拉黑之后能否看到历史内容、本人可见与未知档位的边界,给出可测试的 Go 过滤器和表驱动测试,并说明为什么前端隐藏字段不能替代服务端过滤,最后列出落地时的常见错误与审计要求。
从一次撞库事件讲起,说明账号维度、IP 维度和设备维度为什么要分别计数,给出滑动窗口、成功清零和可读拒绝原因的 Go 限流实现,并用测试覆盖同账号多 IP、同 IP 多账号、窗口过期与成功清零,最后附上本机运行输出和常见错误清单,让防爆破与防撞库不再互相替代。
从「旧手机还能继续用」的线上问题讲起,说明会话不是 token,拆解设备上限、登录时间、踢出原因与多端互踢的产品语义,再用可测试的 Go 会话存储实现设备复用、最旧设备淘汰和不可恢复的撤销,并附上本机测试输出与常见错误清单,帮助团队把踢出动作落成服务端状态,而不是只在前端删掉一个字符串。
从一个账号绑定手机号、微信和 Apple 的冲突讲起,区分账号与身份,给出合并策略、冲突判定和可回归的 Go 绑定实现,并用测试锁定重复回调、幂等绑定与跨账号抢占三种边界,最后附上本机运行输出与常见错误清单,帮助团队在接入第三方登录前把规则写进代码。
共享内核不是把所有代码塞进一个包,而是把可共享的判断放在 core、把端差异隔离在 adapter,并用依赖规则防止逆向泄漏。本节用四层模型与依赖审计函数,演示如何把金额、订单等核心逻辑抽成可跨端复用、可自动检查的内核,并给出内核版本、边界案例与 CI 接入方式。
以「回声」Feed 写扩散与读扩散的取舍为例,说明一份可评审的 ADR 必须同时写清背景、至少两个备选、决定、后果与后继关系,并给出能拒绝单备选、决策不对应选项、非法状态和缺失后继的 Go 校验器,最后复盘一份只写了「我们选了 X」的决策记录如何在半年后让团队重新吵一遍。
以一次账号注销后内容、私信和订单里仍残留用户信息的事故为引子,把用户、内容、关系、订单四类数据的所有权列成表,解释为什么每个数据集只能有一个写者、多个写者为何必须显式登记,并给出可校验重复数据集、空 owner 与越权写者的 Go 实现和表驱动测试。
《Java 虚拟机原理与性能调优》全 31 篇的目录与学习路径:10 章 30 节,从研究方法、类文件与对象布局,到 JIT、GC、内存诊断、线程与锁、启动加速和综合压测调优,给出三条按症状跳读的路线、统一实验口径、项目状态、机器口径与各卷衔接。
客服申诉、作弊复核和经济异常,最终都要落到同一份战斗日志上。本节对比原始输入、裁决事件和结果摘要三层日志的体积与保留期,分析“重演模拟”和“重读记录”两种回放路线的成本、可信度与适用场景,并给出哈希链校验、回放摘要比对和按操作者查询的可运行代码。
从「回声」新用户看到内容、发私信到下单的一条完整旅程出发,把用户故事拆成 actor、触发、结果与副作用四件事,用边界表说明每项能力归谁所有、依赖谁,并给出一个能拒绝缺失字段、重复边界和所有权重叠的 Go 校验器,最后复盘一次跨三个团队却无人对端到端结果负责的上线事故。
把启动、吞吐、p50/p95/p99、GC 次数与停顿、堆占用写成一份基线 JSON,用 scripts/jvm/baseline.py 采集并对比。本节真跑两次基线得到 PASS,再用 -Xint 制造回归得到 FAIL,并用 Little 定律和 p99 曲线给出 libraryd 的容量表与扩容触发条件。
把 99.9%、99.95%、99.99% 换算成每月允许的不可用时长,讨论延迟、错误率与降级后的功能底线,以及数据留存、注销删除与内容安全,并给出一段可测试的 Go 错误预算与 burn rate 实现,文中用第三方支付依赖只有 99.9% 的案例说明预算为何会提前耗尽。
报告端点 p99 40 到 57ms,团队第一反应是加 -Xms2g -Xmx2g -XX:MaxGCPauseMillis=50。本节按现象、证据、假设、改动、回归走一遍,实测三组参数与并发曲线,结论是 GC 停顿只占 p99 的 5%,真正有效的是限制单实例在途请求。
按进程、线程、堆、JFR、字节码、依赖、运行时裁剪和启动参数八层,给出 libraryd 排障会用到的 jps、jcmd、jstack、jmap、jfr、javap、jdeps、jlink、-Xlog、--enable-preview、--enable-native-access 真实命令、观察点与场景,并逐条标注是否在本机执行。
把用户量、请求量与成本拆成三条曲线,用 100 万和 1000 万 DAU 两个完整算例演示从人均请求、峰值系数到副本数的推导,说明每个输入假设的来源与失效后果,并给出一段可测试的 Go 容量估算模型,文中还会分析只按平均 QPS 扩容的典型事故。
同样 5000 个请求、50 并发,ab 不带 -k 是 1909 req/s、p99 78ms,带 -k 是 10201 req/s、p99 17ms。本节用这两份真实输出讲吞吐、均值、分位、连接复用与协调缺失,并用 Little 定律和开环压测器说明为什么并发不是越高越好。
从 arch-lab 订单系统把三个端的入口收敛到边缘网关的决策出发,拆解路由匹配、令牌认证、作用域校验和租户限流四道关卡的顺序与失败语义,给出一个只用标准库的 Go 实现,并用固定时钟验证跨租户配额隔离、401/403/429 的分界以及租户声明缺失时的拒绝路径。