当涉及到exactly-once/transactions/idempotence.时,我能够找到所有关于Kafka Streams应用程序的融合文档
然而,事务的API是在“常规的”生产者/消费者级别上引入的,所有的解释和图表都集中在它们上面。
我想知道在没有Kafka流的情况下是否可以直接使用这些API。我确实理解Kafka处理边界和保证的后果,我可以违反它。我不需要百分之百的精确-一次保证,偶尔有一个副本是可以的,例如,当我从外部系统读取/写入外部系统时。我面临的问题是,我需要为大数据项目创建一个ETL管道,当应用程序被Kubernetes自动重新声明/重新定位到不同的主机时,我们会得到很多副本。一般来说,有一些重复并不是问题,这是一个分析管道,重复是可以接受的,但如果这个问题至少在Kafka方面能得到缓解-那就太好了。使用事务性API会保证Kafka至少一次(以确保重新分配/关闭/伸缩活动发生时不会发生重新处理)吗?
切换到Kafka Streams不是一个选择,因为我们在项目中相当晚。
发布于 2020-12-18 19:08:15
使用常规生产者和消费者也可以实现只需一次的语义。Kafka Streams就是建立在这些客户端之上的。
我们可以使用幂等生成器来实现这一点。
在处理外部系统时,确保我们不会一次又一次地使用producer.send()生成相同的消息,这一点很重要。幂等性适用于Kafka客户端的内部重试,但不会处理对send()的重复调用。
当我们产生来自源的消息时,我们需要确保源不会产生重复的消息。例如,如果它是一个数据库,则使用WAL并最后维护该WAL的最后一次读取偏移量,然后从该点重新启动。例如,Debezium就是这样做的。您可以检查它是否支持您的数据源。
https://stackoverflow.com/questions/65355274
复制相似问题