最后一层 · commit 4ebb1bb · CI 三绿

配置能被机器校验,错误能被人直接照做

JSON Schema · 错误码全集(四段式)· 连接器 SDK · 14 条决策记录

1. 配置:机器可校验

schema/job.schema.json 覆盖全部字段,CI 用 scripts/validate_schema.py 校验示例;编辑器和 AI 助手都能直接读它。

规则怎么落地
未知字段报错additionalProperties: false(打错字比报错更危险)
凭证禁止明文dsn 只匹配 ^(env:|file:)
interval 必须有水位列if frequency=interval → required incremental_column
时长/体积格式统一30s / 5m / 5GB 的正则约束

2. 错误码:14 条,每条都能照着做

代码在 internal/core/codes.go,测试保证:编号唯一、类别与首位数字一致、Message ≤40 个汉字、每条 1–3 步可执行动作、必带风险。

类别例子运行时行为
E1xxxE1001 源库没开变更流水 · E1005 已有实例在跑 · E1006 视图做不了实时停在这里等人做;退出码 3
E2xxxE2001 目标连接被重置 · E2002 源库超时5s/20s/60s 退避,≤3 次
E3xxxE3001 进度与变更流水接不上 · E3002 状态表版本太新不可恢复,停
E4xxxE4001 字典外的类型(已兜底)· E4002 解码器不一致我们的 bug,停并引导提 issue
文案纪律写进测试:Message 不许出现 WAL / LSN / GTID / slot / publication;Next 不许写“请检查配置”这种空话;任何一条都不许以“拒绝”收尾。

3. 连接器 SDK:新增一个库要交什么

五个文件、读侧 8 个方法、写侧 5 个方法,三条硬要求:

  1. 能力探测而非版本判断:缺能力必须带补偿声明(auto / costly / blocked)。
  2. 位点可序列化且可反解:同一个字符串必须能回到同一位置。
  3. 写侧 Apply(ctx, events, position) 位点与数据同事务 —— 接口上强制,想省也省不掉。

建表规则 8 条(默认 utf8mb4、索引延后建、分区不复制、自增值同步后重置序列…)与验收五条(能续跑、断线不重不丢、最低版本补偿正确、不删别的实例对象、矩阵跑过)都在文档里。

4. 决策记录:14 条 ADR

每条写「选了什么 / 为什么 / 代价」。改设计前先读,避免把踩过的坑再踩一遍。

#决策代价
1位点与数据同事务目标库必须可写;MQ sink 只能至少一次
3背压暂停读不暂停 ack源端 WAL 堆积,需要 guard 阈值
5能力运行时探测每个版本都要真机矩阵
7不拒绝只提示用户可能选到会出问题的组合
8job_key 指纹做身份改范围=新任务,要重新初始化
10不做文档站提示文案成本高,每条都要写四段
12verify 三级、L1 只做可加统计L1 漏“值互换”,要靠抽样兜底

证据(都进 CI)

检查内容
buildgofmt / vet / build / test(4 个包带断言:类型字典 15、状态机 17、身份 4、错误码 2 组)
testmatrix每个连接器必须交 testmatrix.yaml
schema示例配置必须通过 JSON Schema

设计已经收口可以开 M1:只做 PG→PG 闭环