v2.0 是课程体系的最后一个包。它新增四个模块 - schema-registry、authorization、share-groups 和 capstones - 外加存储模块中的三个**无盘主题(diskless topics)**场景、dr 模块中的一个双活(active-active)DR 演练,以及 producer 模块中的机架感知分区,合计 24 个新场景。它在自由模式中解锁了 governance 和 diskless 两个层级,并让 Kafka Simulator 的课程体系达到 136 个中的 136 个。
这也是围绕这些场景的演练场被重建的一个版本。自 v1.9 以来,它几乎每个部分都变了:画布有了三种视图,时间线变成了可以阅读的东西,检查器回答问题而不再罗列字段,终端也不再挡住画布。
v2.0 里有什么
Schema Registry(schema-registry,3 个场景)。 subject 与版本、backward、forward 和 full 兼容性各自检查什么,以及一个在注册之前就被拒绝的破坏性变更。
授权(authorization,2 个场景)。 数据路径上的访问控制:在授权器默认拒绝的情况下,一条 ACL 或一个 RBAC 角色绑定如何允许或拒绝一次生产请求。
两者都随新的**治理层级(governance tier)**进入自由模式:Schema Registry、ACL 和 RBAC 控件,以及终端里的 kafka-acls,因此场景里展示的一切,你都可以亲手重建、亲手搞坏。
共享组(share-groups,9 个场景)。 Kafka 的队列语义,由 KIP-932 引入:
- 共享组如何让多个消费者处理同一个分区,逐条确认记录,而不是按已提交的 offset 推进。
- 获取、确认与释放 - 队列式消费背后每条记录的生命周期。
- 投递次数上限与毒丸消息的处理路径 - 一条反复失败的记录如何被归档,而不是被无休止地重新投递。
共享组改变了 Kafka 的消费方式,把它们和经典的消费者组放在一起看,就能看出不同之处。
综合实战(capstones,5 个场景)。 端到端的场景,把持久性、事务、存储、多数据中心和治理结合在一起,而且同一时间发生的事情不止一件:一条能扛过区域丢失的精确一次支付管道、一次零数据丢失的区域故障切换、一次借助 Cluster Linking 完成的零停机迁移、一个多数据中心双活的事件骨干网,以及一条同时针对吞吐量和延迟调优的管道。
灾难恢复(dr,新增 1 个场景)。 一次双活 DR 演练:失去 west 区域,把它的生产者和消费者组迁到 east 继续写入,再重启 west 并把它们迁回。全程不做任何提升,代价是 west 从未镜像出去的那些记录。
生产者(producer,新增 1 个场景)。 机架感知分区:这是 Kafka 4.4 的新功能,生产者把没有键的记录留在自己所在的可用区内,直到该可用区失去它的 leader。详见下文的「Apache Kafka 4.4」。
无盘主题(KIP-1150 方向,KIP-1163/1164 草案)
无盘主题把分区数据保存在对象存储中,而不是 broker 的磁盘上。broker 把来自多个分区的记录缓冲起来,作为一个 WAL 对象上传;无盘协调器在提交该对象时分配 offset,生产请求在提交时得到确认。副本通过从存储中读回该对象来构建自己的日志,而不是从 leader 拉取,生产者和消费者则使用与自己处于同一可用区的副本。
现状如下:KIP-1150 已被接受为方向,而定义其具体工作方式的 KIP-1163 和 KIP-1164 仍处于 Under Discussion 状态(实现进度由 KAFKA-19161 跟踪)。我们模拟的是当前草案,并在模拟器中处处标注为「KIP draft」。在其中任何部分真正进入 Kafka 之前,名称和行为都可能发生变化。
三个场景(storage,05.4.1-05.4.3):
- 无盘:写入路径 - 两个生产者和两个分区共享一个 WAL 对象,在协调器提交之前不存在任何 offset,副本则从对象存储中读回数据。
- 不跨可用区复制 - 同样的 3 条记录分别写入跨三个可用区的经典主题和无盘主题;Cross-AZ traffic 卡片最终显示经典主题 7 跳、无盘主题 0 跳。
- 代价是延迟 - 同一次
acks=all生产,在经典主题上 300 ms 得到确认,在无盘主题上则需要 1300 ms,而一批填满缓冲区的突发写入在 800 ms 内得到确认。这些时间被等比放大,以便每一步都清晰可见。
在自由模式中: 一个 Diskless 3 AZ 预设、按主题切换的无盘开关,以及调节无盘时序的滑块。画布新增一条拥有独立时间轴的对象存储泳道、每个 broker 下方的 WAL 托盘和一个协调器徽标,指标面板则新增一张 Cross-AZ traffic 卡片。在终端中,kafka-topics --create --config diskless.enable=true 会创建一个无盘主题,而 kafka-diskless-metadata(它本身也是草案中的工具,尚未进入 Apache Kafka)会显示每个分区的 offset,并列出存储中的 WAL 对象。
一句话概括其中的取舍:跨可用区的复制流量更少,生产更慢 - 草案的目标是生产延迟 P50 约 500 ms、P99 为 1-2 s。经典 Kafka 已经可以从同一可用区的 follower 读取(KIP-392),因此无盘真正带来的,是没有 broker 之间的复制,以及生产请求不必到达 leader。
Apache Kafka 4.4
模型现在遵循本周发布的 Apache Kafka 4.4。我们对比了 4.3.0 和 4.4.0,没有发现模拟器所依赖的默认值、CLI 输出或错误信息有任何变化,因此场景中的一切都与以前相同。
v2.0 对 4.4 的一项新功能进行了建模:生产者的机架感知分区(KIP-1123)。设置 partitioner.rack.aware=true 和 client.rack 之后,默认分区器会把没有键的记录发送到 leader 位于生产者所在可用区的分区;如果该可用区没有 leader,则发送到任意分区,从而让生产流量留在可用区内。新场景机架感知分区展示了这两种情况。在自由模式中,生产者检查器提供了这个开关,沙盒初始的生产者可以选择自己的 client.rack。没有 client.rack 时,生产者会像 Kafka 一样拒绝这个设置。
另一项 4.4 新功能,共享组的死信队列(KIP-1191),目前还没有建模。
重建的演练场
三种查看集群的方式
画布现在有三种视图,可以从它的工具栏切换:
- Brokers 是熟悉的画面:生产者在左边,集群在中间,消费者组和共享组在右边。
- Lanes 为每个分区画一行,共用一条 offset 轴:副本上下排列,leader 在最前,高水位线是一条贯穿所有副本的线。滞后的 follower 的日志明显更短,已停止的 broker 的日志停在原地,每个消费者都标在自己的读取位置上,并附带已提交的 offset 和滞后。每个参与者在日志中处于什么位置,一眼就能看出来。
- Matrix 适用于大到画不下的集群:一张表,纵向是主题,横向是 broker,配有四个视角 - Failures、Balance、Lag 和 Traffic - 它们为表格着色并把最差的排在前面。把鼠标悬停在某个 broker 上,就能在停掉它之前,按主题逐一看到集群会失去什么。规模较大的自由模式集群会自动以 Matrix 视图打开。
画布展示发生了什么变化
状态变化现在会在发生变化的那个元素上播放,而不是一个通用的脉冲效果:高水位线标记滑到新的 offset,leader 的皇冠从旧 leader 移到新 leader,follower 的 ISR 标签则以变化的颜色显示。生产出来的记录会落在它自己的日志格子上,繁忙的画布把记录画成短轨迹,已停止的 broker 会以淡化的样子留在画布上,让你看得到那里原来有什么。在多区域画布上,镜像链路会显示它的 RPO,每个 DC 色带会说明失去它的代价,网络分区会显示哪一侧继续提供服务,KRaft 条会计算它的多数,共享组的泳道则显示每条记录的锁定计时器和投递次数。
一条读得懂的时间线
在桌面端,底部停靠栏现在是一条单行的轨道(rail):各帧位于它们真实的模拟时间上,因此一阵突发读起来就是一簇,一段平静期就是一个空隙,你可以沿着它拖动来回放。展开它的事件泳道,这次运行中的每个事件都会按生产、复制、broker 和消费几条泳道排开,故障标为红色,每一帧的主要事件也会被标出。
能回答问题的检查器
右侧面板现在从你会问的问题出发。分区呈现为一把 offset 刻度尺,broker 呈现为它停掉时你会失去什么,主题呈现为每个分区一条泳道,生产者呈现为它的发送路径,消费者组则呈现为泳道或分区网格。Why 列出出了什么问题以及原因,Metrics 按角色分组,有些检查器还会展示接下来会发生什么,而不只是当前状态。多区域视图新增一张 DR 卡片,显示每个区域的日志,并把尚未镜像的尾部作为 RPO 显示出来。
画布为终端让出空间
Kafka CLI 终端仍然停靠在画布下方,但现在画布会为它让出空间,而不是被它挡住 - 于是 kafka-server-stop 和 broker-1 宕机会同时出现在屏幕上,终端也能用画布的全部宽度来显示你输入的命令和工具的输出。在宽屏上,点击标题栏中的 dock side 可以把它移到画布旁边的一列。输出保持按列对齐,主机菜单则是一张列出所有 broker 和 controller 的 ssh 表格。broker 的配置文件与 Kafka 4.4 一致,kafka-reassign-partitions --generate 以及在移除 broker 之前先将其排空,都与真实集群上的做法一致。
入门,不再需要导览
13 步的模态导览已经取消。取而代之的是画布角落里的一张 Getting started 卡片:同样的主题,变成一份可以按任意顺序完成的清单,每一项都带有「Show me」。帮助现在是一份供你查阅的参考资料;脚本化场景可以分叉成一个带撤销功能的沙盒;场景会给出自己的「Try it yourself」操作建议和下一步该做什么;分享出去的链接现在会重放它是如何到达所展示状态的。
全新的外观,以及一轮无障碍改进
整个网站,包括演练场,都换上了以我们名字里的寒鸦为灵感的新外观:深墨色、蓝色光泽和灰色,每一组文字颜色对比都达到 WCAG AA。随之而来的还有跳转链接和命名区域、只占一个 Tab 停靠点的场景导航栏、非活动区域的 AA 对比度、按压反馈和更大的触控目标,以及遵循 prefers-reduced-motion 的动效:保留淡入淡出,去掉位移动画。手机布局也单独做了一轮优化,细致到有一项测试专门检查每个标签是否仍然放得下。
演练场之外
演练场本身不可被索引,因此搜索引擎从未看到过其中的场景文字。现在 /kafka-simulator/scenarios/ 下每个场景都有了自己的页面:包括它的引言和结论、每一个带有「Open at this step」链接的步骤、一个可以逐步浏览的真实画布帧,以及它涉及的 Kafka 配置。随着 v2.0 发布,这样的页面一共有 136 个。
与之并列的是针对 Kafka 错误和症状的**故障排查页面**:问题意味着什么、可能的原因、修复方法和不该做的事,以及客户端是否会重试 - 每个页面都链接到出现该问题的场景,并直接打开在问题发生的那一刻。授权相关的页面也随本次发布加入其中。更新日志现在以时间线上的发布说明形式呈现。
还有一件事
我们在这个版本里藏了点东西。能不能找到,就看你的了。
路线图的终点
v2.0 完成了从 v1.0 开始的一切:十一个双周发布包,136 个场景,从单个 broker 的内部构造,一直到队列和全平台的综合实战。一切都在浏览器中确定性地运行,遵循 Apache Kafka 4.4 的语义,没有后端,也不收集任何关于你的场景的遥测数据。
课程体系已经完整,但模拟器是一个沙盒,而不是一门学完就结束的课程。打开模拟器,搭点什么,然后把它搞坏。