Canal-JSON协议DDL只发送索引为0的partiton,导致无法保证DML>DDL>DML顺序消费问题

根据 TiCDC Canal-JSON Protocol 文档中的描述,Canal-JSON 协议是由阿里巴巴的 Canal 定义的一种数据交换格式协议。在 Canal-JSON 协议中,DDL Event 只会被发送到索引为 0 的 partition,这是因为 Canal-JSON 协议最初是为 MySQL 设计的,而 MySQL 中的 DDL 操作是在整个实例上执行的,因此只需要将 DDL Event 发送到一个 partition 上即可。而在 TiDB 中,DDL 操作是在表级别上执行的,因此 TiCDC 通过 Open Protocol 协议将 DDL Event 广播到每个 partition,以保证 DML > DDL > DML 的顺序向下游输出 event 事件。但是,由于 Canal-JSON 协议的限制,当 Sink 的 Kafka Topic 有多个 partition 时,无法保证 DDL 前的 DML 全部消费完后再消费 DDL,这可能会导致在消费端无法保证顺序的问题。为了解决这个问题,建议您使用 Open Protocol 协议来消费 TiCDC 输出的 event 事件,以保证顺序消费。

3 个赞