Kafka Streams应用是否可使用不同broker存储状态及直接对接S3实现恰好一次语义
Kafka Streams 技术问题解答
问题1:是否可以使用不同的Kafka broker集群来存储Kafka Streams应用的状态主题?
原生Kafka Streams不支持该操作。
Kafka Streams的设计逻辑中,应用用到的所有内部主题(包括状态对应的changelog主题、repartition主题)、输入输出主题,以及偏移量存储、事务协调器都必须绑定同一个Kafka集群,也就是你通过bootstrap.servers参数配置的集群。
如果强行自定义实现跨集群存储状态主题,会破坏原生的恰好一次语义保障,状态恢复、任务故障转移的逻辑也会出现不可预期的问题,生产环境完全不推荐这种用法。
问题2:是否可以直接将Amazon S3作为Kafka Streams的sink端实现恰好一次语义,无需先写入输出Topic再消费存储到S3?
可以实现,但需要自定义开发,无法通过原生默认sink算子直接完成。
你可以通过实现Kafka Streams的Processor或Transformer接口完成自定义S3写入逻辑,要保证恰好一次语义需要满足两个核心要求:
- 实现S3写入的幂等性:可以将处理记录的分区、偏移量信息作为S3对象命名的一部分,避免重试写入时生成重复对象
- 绑定Kafka Streams的事务生命周期:确保S3写入持久化成功之后,再提交对应记录的消费偏移量,故障恢复时通过偏移量回溯重新处理未完成写入的记录
相比于先写入输出Topic再通过Kafka Connect S3 Sink连接器同步到S3的方案,直接写入的方案需要你自行处理所有写入故障、重试、一致性校验的逻辑,开发和运维成本更高。
内容的提问来源于stack exchange,提问作者Dinesh Raj
相关产品推荐
相关产品推荐

