fix(delivery): upsert latest schedule event
KAFKA:schd 收敛为每 FLID 单行:V9 先按 (STATE_VERSION DESC, EVENT_ID DESC) 收敛存量再建部分唯一索引 uq_schd_event;写入走带谓词的单行 upsert(只进不退、同版本 tombstone 优先、接受新代次即换 EVENT_ID 并重置 PENDING/清旧错误);读取不再 DISTINCT ON;成功确认改按 (EVENT_ID, STATE_VERSION, PENDING) 条件更新,删除 Dispatcher superseded 清理循环。msg 路径不变。 验证:全量 ./gradlew test 129 tests / 0 fail(新增 3 个用例:单行只进不退、同版本 tombstone 不可复活、发送期间新代次保持 PENDING)。V9 的存量收敛/索引与 upsert SQL 需真实 PG,本机无 Docker 时 FlywayMigrationTest 跳过。
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
-- =====================================================================
|
||||
-- V9:KAFKA:schd outbox 单行化(按 FLID)
|
||||
-- ---------------------------------------------------------------------
|
||||
-- 只动自有 PostgreSQL;共享 MySQL 不建表、不改结构。
|
||||
--
|
||||
-- design「事件投递」:`KAFKA:schd` 只提供最新状态,outbox 按 `FLID` 单行 upsert。
|
||||
-- 存量是按版本追加的多行,必须先收敛再建部分唯一约束,否则升级直接失败:
|
||||
-- 每个 (target='KAFKA:schd', partition_key) 留下 `STATE_VERSION DESC, EVENT_ID DESC`
|
||||
-- 的第一行,与运行时的「只进不退」规则一致;`KAFKA:msg` 仍是多行 append-log,不受约束。
|
||||
-- =====================================================================
|
||||
|
||||
DELETE FROM msg_event a
|
||||
USING msg_event b
|
||||
WHERE a.target = 'KAFKA:schd'
|
||||
AND b.target = 'KAFKA:schd'
|
||||
AND a.partition_key = b.partition_key
|
||||
AND (
|
||||
a.state_version < b.state_version
|
||||
OR (a.state_version = b.state_version AND a.event_id < b.event_id)
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX uq_schd_event
|
||||
ON msg_event (target, partition_key)
|
||||
WHERE target = 'KAFKA:schd';
|
||||
Reference in New Issue
Block a user