第 20 / 23 篇

附录一 练习参考与评审问题

第一至三章:契约与环境

用户目录应以稳定用户身份为主键,明确显示名、状态与组织字段的来源;禁用通常保留事实但改变可访问性,物理删除则需要处理所有副本。权限敏感场景应由权威授权决定读取,不能只依靠异步目录。五个提交边界分别是源库、连接器交付、broker、投影、消费组;Kafka有记录而投影没有,可能是消费者未读取、事务失败或错误世代,分别检查组位点、错误日志与绑定。

版本查询证明实际服务器版本,镜像摘要证明运行内容身份,插件列表证明Connect装载的组件版本。它们不能证明安全性或生产兼容性。端口冲突实验应在专属环境进行,启动失败后只清理该Compose项目,不应终止占用端口的未知服务。

第四至六章:身份、快照与水位

多租户应在源主键、Kafka键与投影主键中共同体现身份,或者明确全局唯一id保证。仅在文档里加tenant_id不能阻止同id覆盖。移除SLEEP后交叠检查可能来不及观测快照,这是测试同步条件不满足,不是连接器算法错误。替代方案需要可观察的真实快照阶段和写入确认,不能只增加固定睡眠。

不同分区的offset独立增长,不能取最大值当作全局水位。增加分区前需要验证键映射、旧记录顺序、投影比较条件与切换;安全路线可以新建topic和世代,而不是原地改变位置的意义。

第七至九章:包络、幂等与崩溃

删除包络写入删除标记,tombstone只推进交付元数据,普通更新替换已知文档。converter包装变化应明确升级契约或解析器,不能忽略所有缺少op的记录。积分加一需要事件级去重与累计更新共享事务,否则重复会重复计数。

当前事务消除了历史已提交而投影未提交的窗口,保留投影成功而位点未确认的重复窗口。把屏障放到Kafka commit之后,重启可能不再重复,但最终仍然相等;因此最终结果相等并不能独自证明测试经过了位点前故障。

第十至十二章:积压、删除与结构变化

示例积压三十六万条,恢复净速度为每秒二百条,理想追平约一千八百秒。数据库锁、网络延迟、批处理、热点与分区限制都会延长时间;增加实例不能拆分单分区。删除标记清理必须约束最早回放位置和旧世代寿命,Kafka压缩不能阻止查询库单独复活旧对象。

必填字段迁移应先部署兼容读取与写入,再补源历史值、支持投影和回填,验收完成后启用强约束功能。只补缺失键的迁移条件应判断文档中不存在note,而不是把已有值无条件覆盖;持续消费还需并发保护和回归验证。

第十三至十五章:重建、对账与定位

持续重建需要独立快照、增量追平、明确切换水位、实际查询验收、原子指针与回收协议。本书真实验证了隔离快照、完整内容与旧世代保留,生产无缝切换仍需实现。数量相同和最大id相同都无法排除中间缺行或字段错误,分段对账需要无遗漏范围和规范编码。

删除排查先查源事实,再查连接器d事件、Kafka同键记录、投影最后offset与deleted,最后查查询过滤。看到Kafka已有删除但投影没更新,可继续查消费者;投影deleted正确但接口仍返回,则更接近读取路径问题。

第十六至十八章:容量、发布与演练

每天一千万条、每条一千字节约十GB原始数据,三天约三十GB,尚未包含副本、索引、内部topic和空间余量。批处理必须保证整批数据库事务完成后才提交末尾位点。交付文档不属于产品输入,更新它不应悄悄改变已发布EPUB。

新增故障演练应使用实际组件,例如主动清理所需binlog后检查连接器失败,再执行真实重建与对账。mock可以帮助验证局部分支,却不能替代复制日志已经丢失时的集成恢复证明。每项演练都应写清故障触发点、保留证据和适用边界。