您正在查看 Debezium 未发布版本的文档。
如果您想查看此页面的最新稳定版本,请在此 查看。

一次性交付

概述

Debezium 提供至少一次的交付保证。这意味着不会遗漏任何更改;然而,在某些情况下,一条记录可能会被多次传递。在某些场景下,这些重复记录可能会造成问题,这时可能需要一次性语义。

一次性交付确保每条更改都会被传递,并且在更改流中出现不超过一次。这比至少一次交付的要求要严格得多。

目前,Debezium 没有实现内部去重层来强制执行一次性语义。然而,当 Debezium 作为源连接器部署在 Kafka Connect 框架中时,它可以利用 Kafka Connect 对一次性交付的支持。

Kafka Connect 对源连接器的一次性交付支持

Kafka Connect 在 KIP-618 中为源连接器引入了对一次性交付的支持。此功能建立在 Kafka 的事务支持以及 KIP-98 中引入的一次性交付机制之上。

已知问题和注意事项

尽管一次性交付在 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 版本必须支持一次性交付(版本 3.3.0 或更高)。

Kafka 工作节点的配置

所有 Kafka Connect 工作节点必须通过在工作节点配置中设置以下属性来启用一次性交付:

exactly.once.source.support=enabled

有关更多详细信息(例如,ACL 配置),请参阅官方 Kafka 文档

源连接器配置

要为特定源连接器启用一次性交付,请在连接器配置中添加以下设置:

exactly.once.support=required

所有 Debezium 源连接器必须将附加设置 `transaction.boundary` 设置为 `poll`。但是,由于 `poll` 是默认值,除非要覆盖它,否则不需要在配置中显式包含此设置。