一次性交付
概述
Debezium 提供至少一次的交付保证。这意味着不会遗漏任何更改;然而,在某些情况下,一条记录可能会被多次传递。在某些场景下,这些重复记录可能会造成问题,这时可能需要一次性语义。
一次性交付确保每条更改都会被传递,并且在更改流中出现不超过一次。这比至少一次交付的要求要严格得多。
目前,Debezium 没有实现内部去重层来强制执行一次性语义。然而,当 Debezium 作为源连接器部署在 Kafka Connect 框架中时,它可以利用 Kafka Connect 对一次性交付的支持。
Kafka Connect 对源连接器的一次性交付支持
已知问题和注意事项
尽管一次性交付在 Kafka 和 Kafka Connect 中已经可用一段时间,但实现是否完全正确,或者是否存在一次性语义可能被违反的边缘情况,仍然不清楚。
迄今为止,还没有全面的研究分析过近期 Kafka 版本中事务和一次性实现(exactly-once implementations)的正确性。然而,两份 Jepsen 报告,一份针对 Redpanda,另一份针对 Bufstream,都指出了 Kafka 协议及其实现中可能存在的问题。这些报告对正确性表示担忧,尤其是在 Bufstream 的案例中。
因此,Apache Kafka 中一些相关的悬而未决的问题如下:
由于 Kafka Connect 的一次性交付依赖于 Kafka 事务,因此可以合理地假设这些问题也可能影响 Kafka Connect 的一次性保证。
|
虽然没有深入研究分析 Kafka Connect 一次性交付的正确性,但 Kafka 事务协议中存在一些已知问题,这些问题也可能影响 Kafka Connect 一次性交付的正确性。 |
支持一次性交付的 Debezium 连接器
以下 Debezium 源连接器支持参与 Kafka Connect 的一次性交付:
-
MariaDB
-
MongoDB
-
MySQL
-
Oracle
-
PostgreSQL
-
SQL Server
配置
Kafka 工作节点的配置
所有 Kafka Connect 工作节点必须通过在工作节点配置中设置以下属性来启用一次性交付:
exactly.once.source.support=enabled
有关更多详细信息(例如,ACL 配置),请参阅官方 Kafka 文档。