以 canal-json[1] 为例,TiCDC 在输出数据变更的同时还会输出 watermark[2] 事件用来通知数据的完整性。
在消费端需要 100% 顺序消费的时候,可以用 watermark 来实现数据排序和去重。
比如
(2,‘b’, ts2)
(1,‘a’, ts1)
(watermark ts2)
(2,‘b’, ts2)
(3,‘b’, ts3)
(watermark ts3)
(watermark ts3)
(4,‘b’, ts4)
ts2 代表 ts = 2。
消费端需要实现一个缓存出现在 watermark 之前的事件。在收到 watermark 之后,消费端通过 watermark ts2 来排序缓存的事件。
比如 watermark ts2 可以排序 (1,‘a’, ts1) 和 (2,‘b’, ts2);watermark ts3 可以去重 (2,‘b’, ts2)。
注意 watermark 本身可能会重复,消费端还需要记录看见的最大的 watermark ts。
[1]: TiCDC Canal-JSON Protocol | PingCAP Docs
[2]: Streaming 102: The world beyond batch – O’Reilly (oreilly.com)