Amazon s3 并行环境下带偏移管理的Kafka流容错

Amazon s3 并行环境下带偏移管理的Kafka流容错,amazon-s3,apache-kafka,kafka-consumer-api,apache-kafka-streams,apache-kafka-connect,Amazon S3,Apache Kafka,Kafka Consumer Api,Apache Kafka Streams,Apache Kafka Connect,说明: 我有一个Kafka流应用程序,它正在使用一个主题。 这些活动的数量很大 KafkaStream将这些事件作为终端操作使用,并将这些事件合并为一组,比如1000个事件,然后将其写入AWS S3 我有一些线程在消费了Kafka主题中的事件后并行地写入s3 由于某些业务应用程序逻辑和处理,未使用kafka-connector-s3 问题: 我希望应用程序具有容错性,但不希望丢失消息 -->崩溃场景 假设应用程序有10个线程,所有线程都在运行并试图将事件放入S3中,在这种情况下会发生崩溃,因为K

说明

我有一个Kafka流应用程序,它正在使用一个主题。 这些活动的数量很大

KafkaStream将这些事件作为终端操作使用,并将这些事件合并为一组,比如1000个事件,然后将其写入AWS S3

我有一些线程在消费了Kafka主题中的事件后并行地写入s3

由于某些业务应用程序逻辑和处理,未使用kafka-connector-s3

问题

我希望应用程序具有容错性,但不希望丢失消息

-->崩溃场景

假设应用程序有10个线程,所有线程都在运行并试图将事件放入S3中,在这种情况下会发生崩溃,因为KafkaStream已经(enable.auto.commit=false),我们无法手动提交偏移量,并且所有线程都已使用来自Kafka主题的消息。 在本例中,KafkaStreams已经在读取后提交了偏移量,但它无法将事件处理到S3

我需要一个机制,这样我就可以确定在事件成功写入S3文件之前的最后偏移量是多少。 在崩溃场景中,我应该如何处理这个问题,以及如何管理卡夫卡流中的卡夫卡偏移量,因为我正在使用10个线程。如果一些未能写入s3,而另一些被通过了呢。如何确保偏移量的排序成功处理到s3

如果我不清楚如何描述我的问题陈述,请告诉我


谢谢

我可以向您保证,在卡夫卡流中,
enable.auto.commit
设置为
false
。州政府的Javadocs

“enable.auto.commit”(false)-Streams客户端将始终禁用/关闭自动提交

您是对的,Kafka Streams将以或多或少的固定间隔自动提交。但是,Kafka流在提交相应的偏移量之前会等待处理记录。这意味着您至少可以获得一次保证,并且不会丢失消息

据我所知,在将记录发送到S3之前,您的终端处理器不会阻塞。这意味着,卡夫卡流无法知道发送何时完成。Kafka Streams只看到终端处理器完成了处理,然后——如果提交间隔已过——提交偏移量

你说

由于某些业务应用程序逻辑和处理,未使用kafka-connector-s3

能否将业务应用程序逻辑放入Kafka Streams应用程序中,使用运算符
to()
将结果写入Kafka主题,然后使用Kafka-connector-s3将该主题中的消息发送到s3?
我不是连接专家,但我想这将确保消息不会丢失,并使您的实现更简单。

你好,布鲁诺,谢谢。在我的用例中,我实际上希望使用来自kafka的消息,并将一堆消息(比如5000条消息)写入s3,因为写入s3是一个耗时的操作。现在,如果我从流开始消费直到5000条消息,然后执行S3写入,那么偏移量将被提交到5000条消息,如果S3写入失败。我正在考虑使用Kafka Consumer,因为它支持手动提交偏移量。我相信kafka streams最适合您对kafka主题进行读写操作,但在这里,我只是阅读并执行终端操作。关于kafka streams与kafka consumers,您对此有何看法?如果您想对偏移提交拥有最大的控制权,您应该使用kafka consumers。请注意,在Kafka Streams中,如果您使用可以访问
ProcessorContext
的操作,例如
process()
transform()
,则也可以请求提交。使用<代码>提交.Time.ms >代码>您可以控制由卡夫卡流自动完成的提交间隔。关于将多个线程写入S3,我将考虑使用更多的流线程和/或运行更多的卡夫卡流客户端并行地使用输入主题的分区的数量进行缩放。(或更多卡夫卡消费者)。如果您的输入分区只有很少的分区,您可以先将输入主题的消息写入具有更多分区的主题,然后从该主题中读取并按分区号缩放。您还没有回答我的问题,即是否可以先使用Kafka Streams应用您的业务逻辑,然后将消息写入主题d然后使用S3连接器。如果它不是一个选项,我会很感兴趣为什么它不是一个选项?使用Kafka Streams和Connect可以免除您在发生故障时实现低级别功能(如偏移管理)的负担。