[英]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.