Apache kafka 通过重试将卡夫卡传送到S3
我是Flink的新手,我需要从Kafka读取数据,如果记录属于X类,则有条件地丰富这些数据,方法是使用一些API并写入S3 我用上面的逻辑制作了一个hello world Flink应用程序,它就像一个魔咒 但是,我用来充实的API没有100%的正常运行时间SLA,所以我需要设计一些带有重试逻辑的东西 以下是我找到的选项 选项1进行指数重试,直到从API获得响应,但这会阻塞队列,所以我不喜欢这样 选项2使用另一个名为topic failure的主题,并在API关闭时将其发布到topic failure。这样它就不会阻塞实际的主队列。我还需要一个工人来处理队列主题failure中的数据。同样,如果API长时间停机,该队列必须用作循环队列。例如,从队列主题失败中读取消息。如果消息未能推送到名为“主题失败”的同一队列并使用队列主题失败中的下一条消息,请尝试充实消息Apache kafka 通过重试将卡夫卡传送到S3,apache-kafka,apache-flink,flink-streaming,Apache Kafka,Apache Flink,Flink Streaming,我是Flink的新手,我需要从Kafka读取数据,如果记录属于X类,则有条件地丰富这些数据,方法是使用一些API并写入S3 我用上面的逻辑制作了一个hello world Flink应用程序,它就像一个魔咒 但是,我用来充实的API没有100%的正常运行时间SLA,所以我需要设计一些带有重试逻辑的东西 以下是我找到的选项 选项1进行指数重试,直到从API获得响应,但这会阻塞队列,所以我不喜欢这样 选项2使用另一个名为topic failure的主题,并在API关闭时将其发布到topic fail
我更喜欢选项2,但完成这项任务似乎并不容易。是否有任何标准的Flink方法可用于实现选项2?这是从微服务迁移时出现的一个相当常见的问题。正确的解决方案是将查找数据也放在Kafka或某些数据库中,这些数据库可以作为附加源集成到同一Flink应用程序中 如果您不能做到这一点,例如,API是外部的,或者数据无法轻松映射到数据存储,那么这两种方法都是可行的,它们具有不同的优势 1将允许您保留输入事件的顺序。如果下游应用程序需要有序性,则需要重试 2常见的术语是死信队列,但更常用于无效记录。在Flink中有两种简单的集成方法,一种是使用单独的源代码,另一种是使用一个源代码的主题模式/列表 您的拓扑结构如下所示:
Kafka Source -\ Async IO /-> Filter good -> S3 sink
+-> Union -> with timeout -+
Kafka Source dead -/ (for API call!) \-> Filter bad -> Kafka sink dead
对同一卡夫卡主题的读写卡夫卡源死将如何处理故障?我从kafka读取数据,假设API扩展失败,将数据推送到kafka sink dead。因此,假设我们进行了5次重试,但在读取时没有提交偏移量,在这种情况下,我们推送了5次相同的消息,对吗?如何处理?如果您只使用一次Flink,您将免费获得所需的行为:数据写入到Kafka主题的事务中,并且仅在检查点成功后提交。因此,在发生故障和恢复时,只重新处理尚未产生提交输出的数据。当然,如果API失败多次重试,数据可能会在死主题中出现多次,但一次不会处理多次。哦,天哪!我没有足够的声誉来支持你的回答。但我接受了这个答案。我很确定这是一些常见的用例,但不确定为什么我找不到任何博客。我建议你写一篇关于这个的博客。谢谢!