这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Java 消息中间件·Kafka 内核与客户端》2.2 Topic 的物理结构
一个分区在磁盘上不是一个文件,而是一组按 base offset 命名的段。本节用两次真实写入制造时间滚动,拆开 .log、.index、.timeindex、.snapshot 的职责,解释 20 条记录为什么只产生 1 个索引项,并走一遍从 offset 到字节位置的寻址路径。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
一个分区在磁盘上不是一个文件,而是一组按 base offset 命名的段。本节用两次真实写入制造时间滚动,拆开 .log、.index、.timeindex、.snapshot 的职责,解释 20 条记录为什么只产生 1 个索引项,并走一遍从 offset 到字节位置的寻址路径。
单节点能验证命令,三节点才能验证副本。本节先把 listeners、advertised.listeners 与 controller quorum 三组地址的分工讲透,再用真实的单节点启动日志和一个故意写错 advertised 的失败实验,解释为什么客户端连上了却读不到元数据,最后给出可直接使用的三节点 compose。
at-most-once、at-least-once、exactly-once 不是三个开关,而是三组失败窗口的取舍。本节先打出 4.3.0 的真实默认值,再分别复现「提交早于处理」的丢失、「处理完未提交」的重复、事务提交与 abort 的可见性,最后划清 exactly-once 只在 Kafka 读写链路内成立的边界。
5 条按顺序发出的消息,消费者看到的却是另一种顺序。本节用 3 个分区实测落点 1、2、2、0、1,从 murmur2 哈希与粘性分区讲到同 key 同分区,再把分区数的三笔代价——并行上限、文件与内存、故障恢复——逐条算清楚,并给出一个可操作的分区数估算顺序。
从队列、发布订阅、日志、流四种形态的差别入手,用单节点 Kafka 发 5 条消息、两个消费组读到不同位置、消费后日志段仍完整保留的实验,说明 Kafka 为什么选分区日志,以及「消费不删数据、位移是读者自己的进度」在工程上到底意味着什么。
本卷 15 章 45 节加两个附录,按「先建立直觉、再进服务端、再读客户端源码、最后做运维」的顺序组织。这篇目录给出完整章节索引、三条阅读路径、每章回答的具体问题、读之前需要的前置知识,以及哪些实验可以跳过,方便你按手上的故障或疑问直接跳读。
本书所有实验都在同一台机器上完成:Temurin 25.0.5+8、colima 里的 Docker 29.5.2、apache/kafka:4.3.0 的 KRaft 集群。这篇前言给出单节点与三节点两套底座的完整启动命令、客户端工程的最小 pom、源码核实方法,以及「单次运行不作基准」和「未在本机执行」两条数据口径的具体用法。
客服主管为处理一笔投诉,给客服角色临时开了改价权限;三个月后权限仍在,一次批量改价把毛利打穿。文章区分后台权限与用户权限,说明最小权限、角色定义校验和写操作审计该怎么落地,并给出 Role、Allow、Validate 的 Go 实现与真实测试输出。
消息队列最常见的三类误判,是把「发了」当成「到了」、把「分区有序」当成「全局有序」、把「配了 acks=all」当成「不会丢」。本序用三个可以在本机复现的现象拆掉这三层幻觉,说明本书为什么坚持每个结论都要有命令和原始输出,并交代三卷各自回答什么问题。
GeoDNS 把流量切到备用区,备用区的健康检查全部通过,用户却登录不了,因为那边没有刚写入的会话和数据。文章用一个多区域故障切换的事故,说明就近接入为什么不等于就近有数据、切区为什么要固定顺序、数据延迟如何影响可用性,并给出 Route 的 Go 实现、故障顺序测试和真实运行输出。
EU 用户的姓名与收货地址,被一份周报 ETL 同步到 cn 区做汇总,审计时才发现违反数据驻留要求。文章用一个跨境电商的合规事故,说明驻留是法律约束而非性能优化、个人数据与日志的等级差异、跨境开关为什么要单独设计,并给出 Allowed 与 Check 的 Go 实现、等级矩阵测试和真实运行输出。
会员订阅卖出 19.90 美元,退款时却出现 19.899999。文章用一个跨币种结算的场景,说明金额为什么必须存最小单位、locale 与 currency 为什么是两个维度、时区为什么只影响展示,并给出 Money、MinorUnits、Format 的 Go 实现、负数与币种精度测试,以及真实运行输出。
物流查询接口超时,整个订单详情页跟着打不开;文章说明第三方故障为什么要按依赖隔离、熔断的 closed/open/half_open 如何流转、降级应该返回什么,并给出 Health、State、Record 的 Go 实现、状态机测试与真实运行输出。
支付回调只签了 body、没签时间戳,攻击者把同一条成功通知重放三次,订单被重复发货;文章说明签名必须覆盖哪些字段、重放窗口为什么越短越好、nonce 存储怎样清理,并给出 Sign、Verify、Replay 的 Go 实现、已知向量测试与真实运行输出。
一个第三方应用为了省事申请了全部 scope,被拖库后影响所有用户;文章从应用身份与用户身份分离讲起,说明最小权限、按应用与接口两个维度配额的取舍,并给出 App、Authorize、CheckQuota 的 Go 实现、边界测试与真实运行输出。
用户在 App 内退订了营销消息,短信却仍在发送,最终收到投诉。文章说明退订为什么是合规要求而不是体验优化、频控为什么要分渠道、事务通知与营销通知为什么要走不同队列,并给出 Allowed 与 AllowSend 的 Go 实现、边界测试和真实运行输出。
沉睡用户召回上线后,看板显示推送活动带来一万二千回流,预算继续加投;扣除自然回流后,真实增量不到三成。文章说明触达、点击、转化为什么要分开记,归因窗口与最后触点怎样定义,自然量如何识别,并给出 Attribute 的 Go 实现、边界测试与真实输出。
会员日前运营圈出一份八百万人的推送名单,要求当晚 20:00 全量发送,结果推送通道被打满,正常订单通知延迟两小时。文章说明圈选条件怎样写成可解释的规则、触达为什么要分批、排除名单为什么优先于其他条件,并给出 Select 的 Go 实现、边界测试与真实运行输出。
大促前临时加的一个结算降级开关,半年后没人说得清它控制什么;一次配置清理把它删掉,降级链路在流量高峰失效。文章说明开关为什么是运行时配置而不是发布、owner 与过期时间如何治理、默认值怎样保证失败关闭,并给出 Flag 的 Go 实现与真实测试输出。
定价页实验跑到第三天,转化率差异的 z 值达到 2.1,团队当天全量;第四天数据回落到基线。文章解释显著性为什么不等于差异大、样本量与最小可检测效应怎么定、偷看和多重比较如何抬高假阳性,并给出双比例 z 检验的 Go 实现与完整的真实测试输出。