Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 通过重试将卡夫卡传送到S3_Apache Kafka_Apache Flink_Flink Streaming - Fatal编程技术网

Apache kafka 通过重试将卡夫卡传送到S3

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

我是Flink的新手,我需要从Kafka读取数据,如果记录属于X类,则有条件地丰富这些数据,方法是使用一些API并写入S3

我用上面的逻辑制作了一个hello world Flink应用程序,它就像一个魔咒

但是,我用来充实的API没有100%的正常运行时间SLA,所以我需要设计一些带有重试逻辑的东西

以下是我找到的选项

选项1进行指数重试,直到从API获得响应,但这会阻塞队列,所以我不喜欢这样

选项2使用另一个名为topic failure的主题,并在API关闭时将其发布到topic failure。这样它就不会阻塞实际的主队列。我还需要一个工人来处理队列主题failure中的数据。同样,如果API长时间停机,该队列必须用作循环队列。例如,从队列主题失败中读取消息。如果消息未能推送到名为“主题失败”的同一队列并使用队列主题失败中的下一条消息,请尝试充实消息


我更喜欢选项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失败多次重试,数据可能会在死主题中出现多次,但一次不会处理多次。哦,天哪!我没有足够的声誉来支持你的回答。但我接受了这个答案。我很确定这是一些常见的用例,但不确定为什么我找不到任何博客。我建议你写一篇关于这个的博客。谢谢!