恰好一次交付
恰好一次投递
概述
Debezium 提供至少一次投递保证。这意味着不会遗漏任何更改;但在某些情况下,同一条记录可能会被投递多次。在特定场景中,这些重复记录可能会带来问题,此时可能需要恰好一次语义。
恰好一次投递确保每个更改都被投递,并且在更改流中出现不超过一次。这比至少一次投递的要求严格得多。
目前,Debezium 尚未实现内部去重层来强制执行恰好一次语义。不过,当 Debezium 作为源连接器部署在 Kafka Connect 框架中时,它可以利用 Kafka Connect 对恰好一次投递的支持。
Kafka Connect 对源连接器的恰好一次支持
Kafka Connect 在 KIP-618 中引入了对源连接器恰好一次投递的支持。此功能建立在 Kafka 的事务支持以及 KIP-98 中引入的恰好一次投递机制之上。
已知问题与注意事项
尽管恰好一次投递功能在 Kafka 和 Kafka Connect 中已可用一段时间,但其实现是否完全正确,以及是否存在可能违反恰好一次语义的边界情况,目前仍不明确。
迄今为止,尚无全面的研究对近期 Kafka 版本中事务和恰好一次实现的正确性进行分析。不过,两份 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 是默认值,除非需要覆盖该值,否则无需在配置中显式包含此设置。
评论
登录后参与评论
KnowForge