繁体   English   中英

Flink:将消息发布到外部 API:自定义接收器或 lambda function

[英]Flink: posting messages to an external API: custom sink or lambda function

我们正在 apache flink(数据流 API)中开发一个管道,该管道需要使用 API 调用将其消息发送到外部系统。 有时这样的 API 调用会失败,在这种情况下,我们的消息需要一些额外的处理(和/或重试)。

我们有几个选项可以做到这一点:

  • We map() our stream through a function that does the API call and get the result of the API call returned, so we can act upon failures subsequently (this was my original idea, and why i did this: flink scala map with dead letter队列

  • 我们编写了一个自定义接收器 function 执行相同的操作。

但是,我认为这两种选择都有问题:

  • 使用map()方法,我将无法获得恰好一次(或最多一次也可以)语义,因为 flink 在从崩溃中恢复后可以自由地重新执行管道片段以获得 state最新。

  • 使用自定义接收器方法,我无法获得失败的 API 调用的 stream 要求进一步处理:从 flink APP 的角度来看,接收器是死胡同。

这个问题有更好的解决方案吗?

异步 i/o 操作符是为这种情况设计的。 这是一个比map更好的起点。

最近还进行了开发通用异步接收器的工作,请参阅FLIP-171 这已合并到 master 中,并将作为 Flink 1.15 的一部分发布。

其中之一应该是您前进的最佳方式。 无论你做什么,都不要在你的用户函数中阻塞 i/o。 这会导致背压,并经常导致性能问题和检查点故障。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM