这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《互联网产品的服务端架构·产品、流量与基础能力》1.1 产品形态如何决定服务端形状
从「回声」的内容流、私信与下单三个产品事实出发,说明服务端分类为什么按实时、强一致、读写比、写多的优先级展开,给出四种形状的必备能力与主要风险,并用一段可测试的 Go 分类器把判断固定下来,文中还会拆解两次典型事故,帮助读者在选型前先问对问题。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
从「回声」的内容流、私信与下单三个产品事实出发,说明服务端分类为什么按实时、强一致、读写比、写多的优先级展开,给出四种形状的必备能力与主要风险,并用一段可测试的 Go 分类器把判断固定下来,文中还会拆解两次典型事故,帮助读者在选型前先问对问题。
按 JDK 8/11/17/21/25 五个基线,把 records、sealed、模式匹配、虚拟线程、ScopedValue、FFM、StructuredTaskScope、JEP 491 与 JEP 472 的状态整理成矩阵,逐行标注正式、预览、移除及对 libraryd 的影响,并给出本机验证命令与常见版本误记。
JDK 25 的 AOT 缓存分 record、create、run 三阶段,缓存类链接结果和方法 profile,不是机器码。本节实测归档大小、目录 classpath 的失败、create 阶段漏传 classpath 的报错与 jar 变更后的降级行为,并把 AOT 缓存、AppCDS 与 GraalVM Native Image 的适用边界分开。
卷一《产品、流量与基础能力》的阅读入口:13 章分四段的结构、章节依赖图、三条阅读路径、症状到章节的对照表,以及贯穿项目 webapp-lab 的代码分级、假设数字口径、与已有书稿的边界和从产品事实到服务端形状的完整链路,读完可判断自己是否真的读懂了本卷。
默认 CDS 已经把 JDK 核心类放进共享归档,AppCDS 只负责应用类。本节用 -Xshare:dump、ArchiveClassesAtExit、SharedArchiveFile 和 jcmd VM.cds 实测归档大小与启动差异,并给出目录 classpath 失败、相对路径失效和 -Xshare:on 硬失败的处理方式。
把第 2 章的反射与动态代理整理成可套用模板:三个运行时注解、按实现类查找注解的审计与事务拦截器、Repository<T, ID> 代理工厂、record 组件读取、MethodHandles 替代,以及 InaccessibleObjectException 与模块 opens 处理。
前言说明四卷的分工与顺序、为什么从产品约束写到规模化,交代 Go 1.26.0 与 webapp-lab 的工程约定、三行代码头、L1 到 L4 分级、命名与导航规则、事实纪律,以及本卷实际可用的验证命令和与站内已有专题的边界,并给出一套最小阅读环境与跳读顺序。
把 libraryd 的启动拆成进程启动、VM 初始化、类加载、main 返回和首请求五个时间点。本节用 startuptime、class+load、JFR ClassLoad 与十次重复测量,给出 Hello 与最小 HTTP 服务的真实分布,并解释 readiness 通过为什么不等于首请求就绪。
从一次没有结论的产品评审写起,说明这本书为什么要用一条连续线连接产品约束、基础能力、内容社交、交易增长与规模化,交代它明确不做什么、为什么只围绕「回声」一个产品展开,以及三类读者各自可以采用的读法,并说明假设数字与代码验证的使用边界,先读序言可以判断它是否适合你。
多端架构的第一步不是共享代码,而是定义哪些行为必须一致、哪些可以等价、哪些允许不同。本节给出 Web、iOS、Android、小程序与桌面五类端形态的承诺矩阵,用可运行的 TypeScript 模块把承诺等级、覆盖缺口与最弱端算出来,并说明承诺如何反过来约束实现。
「回声」的搜索摘要缓存只按查询文本建键,两个租户问同一句退款政策时互相串了结果。本节把精确缓存、语义缓存与结果复用拆成三层,讲清作用域键的五个要素、字符二元组相似度与 0.72 阈值、订单号与动作词两道护栏,并给出可运行的 TypeScript 实现与测试。
按 libraryd 的借阅计数、事件流水线与仪表盘聚合三条线,整理 volatile、synchronized、ReentrantLock、Condition、原子类、ConcurrentHashMap、六种阻塞队列、同步器、Executors、虚拟线程与 StructuredTaskScope 的关键方法、选型与常见误用,并标注 JDK 25 的预览状态。
1000 个虚拟线程只对应 2 个载体,这是怎么做到的?本节用 Thread.vthread_scheduler、JSON 线程容器和 pin 心跳实验拆开 Continuation、mount/unmount 与调度,验证 JDK 25 的 synchronized 不再 pin,而本地调用和类初始化仍会占住载体。
生命周期不是回调清单,而是一台可验证的状态机。本节把 Android 的 onPause、onStop、onDestroy 与 iOS 的前后台通知映射为 created、foregrounded、backgrounded、suspended、resumed、destroyed 六个状态,用注入 Clock 判定冷热启动分界,并比较消消与方舟在恢复动作上的差异。
JFR 找到热点之后,下一步不是立刻改代码,而是算收益。本节用同一台机器对比 Loan.state 与直接罚金计算的分配采样,用 JMH 量化 synchronized 与 LongAdder 的差距,并比较批量循环与 stream,最后给出 libraryd 的「先测量、再改、再回归」决策表。
JDK 25 已经没有偏向锁。本节用 PrintFlagsFinal 确认 UseBiasedLocking 消失,用 javap 看 synchronized 方法与方法块的字节码差异,再用 JFR 记录 JavaMonitorEnter、Wait 与 Inflate,对比 synchronized 和 ReentrantLock 的真实竞争事件。
卷四《规模化与架构演进》的完整目录与学习路径:13 章 39 节,从承诺矩阵与共享内核开始,依次覆盖设计系统、插件化、性能、稳定性、构建交付、可观测性、安全隐私、国际化、无障碍、治理与迁移,最后以多端端到端收口;附章依赖、三条阅读路径与读完应能回答的六个问题。
JMH 告诉你一次调用多快,JFR 告诉你时间花在哪。本节用 JDK 25 内置 Flight Recorder 记录 10 秒 libraryd 负载,执行 jfr summary、jfr view hot-methods 与 jfr print --events jdk.ExecutionSample,引用 156 个采样和 272 MB Overdue 分配,并说明火焰图边界。
jstack 看不到虚拟线程。本节用 1000 个虚拟线程加 4 个平台工作线程实测 Thread.print 与 Thread.dump_to_file,读出 JSON 里的 root、ThreadPerTaskExecutor 与 ForkJoinPool 容器,并给出死锁检测、线程状态判断和 libraryd 的转储脚本。
用 System.nanoTime 包一个循环,测出来的往往是 JIT 删除后的空操作。本节用 JMH 1.37 真跑 FinePolicyBenchmark,给出 Warmup、Measurement、Fork 配置和真实结果表,解释 JDK 25 下注解处理器默认关闭导致的 BenchmarkList 缺失,以及为什么 1.8 ns 的差异不能直接当成结论。