这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Java 服务端通信工程》1.2 错误模型与状态码
把 gRPC 的 Status 码、trailers 与 google.rpc.ErrorInfo 分成三层,给出 linkd-v3 六个错误原因码到状态码的映射和可重试判定,并用 RpcError 的 toException/from 实现服务端抛错、客户端还原的完整闭环。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
把 gRPC 的 Status 码、trailers 与 google.rpc.ErrorInfo 分成三层,给出 linkd-v3 六个错误原因码到状态码的映射和可重试判定,并用 RpcError 的 toException/from 实现服务端抛错、客户端还原的完整闭环。
把「调用一个远程方法」拆成方法标识、参数、关联、时间和错误五个语义要素,再逐一映射到 HTTP/2 的 HEADERS、DATA 与 trailers,给出 gRPC 五字节消息前缀的编解码代码,并用 MethodDescriptor 在 9093 上跑通一次 unary 调用。
《Java 服务端通信工程》全书导航:给出把 RPC 用对、把治理做起来、把系统跑稳三条学习路径,列出十五章四十五节的入口、每章验收动作与通过判据、linkd-v3 四模块的推进状态、章节依赖、跳读后果和附录用法,方便按目标定位或按依赖跳读。
交代本书的三种读法、前置知识、JDK 25 与 gRPC 1.76.0 的环境搭建、comm-api 等四模块与 9093/9094/9095 端口约定,并给出全卷统一的代码风格、默认参数、验证命令和本机能力边界,方便在动手前把团队口径对齐。
从「回声」上线好友功能后的一次投诉写起:一方删除好友,另一方仍能看到仅好友可见的动态。文章拆解关注、好友与拉黑三种边的方向语义,说明关注后对方是否知情、好友请求被拒后关系如何落库,给出 Validate 与 Mutual 的 Go 实现、表驱动测试和真实运行输出,并列出关系建模的常见错误与边界。
按钮组件从 1.4 升到 1.5,发布说明写着「只加了可选属性」,四十多个业务包却在编译期报错。问题不在版本号,而在没人把组件契约当成可比较的对象。本节用 TypeScript 模块演示属性、事件、插槽与可访问性语义的变更分类、兼容判定、版本递增和契约快照比较。
《Java 服务端通信工程》开篇:从一条能跑通的 RPC 调用出发,说明上线后会遇到的超时、重试放大、错误码丢失、版本兼容与容量问题,交代 linkd-v3 的四模块、9093/9094/9095 端口,以及全书的最小可运行闭环和三卷本定位。
从实验组点击率涨了 8%、次留却跌了 2% 的事故写起,说明分桶必须稳定、指标必须先定、实验期间不能混入其他改动;给出基于 FNV 的 0 到 99 分桶、rollout 判定与相对提升计算的可测试 Go 实现,并讨论点击与留存的取舍,附真实运行输出。
从用户点过一条内容、刷新后它就消失的投诉写起,区分按内容 ID 去重与按事件去重,讨论已读是否应该影响排序,以及同作者相邻内容从哪里开始折叠;给出保持顺序、容忍 nil 入参的 Go 实现与边界测试,避免误删与重复曝光,并附上真实运行输出。
从三天前爆款占满首页的事故写起,拆解时间衰减、点赞热度与作者亲和度三种信号各自的偏差,说明多样性其实是限制同作者与同话题占比,而不是随机打散;给出带权重校验和稳定排序的可测试 Go 实现,以及新内容起不来的排查与修正路径,并附真实测试输出。
从普通用户关注 800 人的首页出发,拆解混合时间线为什么必须按作者分层而不是按用户分层:活跃作者推、长尾作者拉,合并顺序与名额分配怎样决定大 V 内容能否出现在第一屏,并用可测试的 Go 混合函数固定比例、去重与上限的边界,最后给出覆盖率监控与灰度顺序。
验收不是再跑一遍健康检查。本节把 linkd-v2 的验收拆成功能与协议一致性清单、五类故障注入、优雅关闭、指标与日志四块,每项给出可复制命令、预期与证据;再对比卷一手写 linkd v1 与 Netty 版 linkd-v2 的差异和代价,并给出带「验收缺口」的复盘模板。
15.1 的网关能转发,但下游变慢时会拖垮自己。本节用纯 JDK 给 linkd-v2 补三层保护:每 IP 与每连接的令牌桶限流返回 429 与 Retry-After,连接、读与总预算分层超时,连续失败打开、半开探测的熔断返回 503,并给出内存上限、清理策略与压测验证命令。
3.3 的 GatewayHandler 把转发交给虚拟线程,本节把它收回 EventLoop:用路由表把 9090 的 /books/{id} 重写到 libraryd 8080,过滤 Hop-by-hop 头,基于 Bootstrap、HttpClientCodec 与 HttpObjectAggregator 做异步转发,讲清连接复用、超时与 502/504 的判据。
一个可复现的 linkd-v2 调优案例:100 条 9093 连接、8 KiB 负载,worker=1 时单条 EventLoop 接近满核,p50 12 ms、p99 33 ms。用 jcmd 线程栈、JFR ExecutionSample 与 GC 停顿排除法定位,只把 worker 从 1 改成 4,给出前后对比表与回归清单,所有数字标注单次运行、未做统计。
ab 能打 HTTP/1.1,wrk 和 hey 本机没装;9093 的自定义帧协议要用 Java 客户端压。本节给出可复制的 ab 命令、虚拟线程 FrameLoadClient、吞吐与 p50/p95/p99 口径、Little 定律、coordinated omission、预热与多轮方法,以及结果记录模板,所有数字都标注单次运行、未做统计。
调优前先固定一组能复现的起点:boss=1、worker 显式 4、backlog 1024、TCP_NODELAY、32/128 KiB 水位、PooledByteBufAllocator 与 AUTO_READ=true。本节用 BaselineProbe 打印 linkd-v2 的真实配置,说明每个值的作用、验证方式和该改的信号,强调基线不是最优值。
把 linkd-v2 变慢后的排查顺序固定为连接、线程、内存、JFR 四步,给出 lsof、netstat、jcmd Thread.print、GC.heap_info 与 JFR 的真实输出和判读方法,并说明 JFR 记录不到正在阻塞的线程这一边界。
拆开 JVM 的 MaxDirectMemorySize 与 Netty 的 io.netty.maxDirectMemory 两层限制,用 metric() 读直接内存、arena 与线程缓存,实测上限如何压缩 arena 数量,并给出 linkd-v2 的阈值告警。
把 ResourceLeakDetector 的四档级别、property 与 setLevel 的覆盖关系讲清楚,用一个故意不 release 的最小程序跑出 PARANOID 报告,逐段读创建栈与最近访问栈,并给出 linkd-v2 的限时开启与回退步骤。