背景:
我们有一个flink管道,它由多个源、多个汇和管道沿线的多个操作符组成,这些操作符还更新数据库。
为了解决这个问题并使之更简单,让我们假设我们有一个管道,它看起来是这样的:
Source -> KeyBy -> FlatMap -> Filter -> Sink
这个管道应该允许我们监听有关某些数据更改的通知(每个通知都包含一个id),对于每个通知,我们从db读取数据,运行算法并更新同一db行。在那之后,我们还发出数据变化的幅度。只有当数据变化幅度足够大时,我们才会向另一个Kafka主题发出通知。
源代码订阅kafka主题以侦听关于更改的数据id的通知。
keyby通过id设置密钥,以确保同一id不会同时被两个操作符示例处理。
给定id,flatmap从db读取数据,运行算法并更新同一db行。它发出变化幅度。这是一个平面图,而不是一个Map,因为在某些情况下,我们不想发出任何变化幅度,例如,如果我们有一些特定的错误。
过滤器过滤流中小于某个阈值的量级
接收器正在将过滤后的通知发送到另一个Kafka主题。
问题:
我们想用一次语义来运行管道。从我们所看到的,FLink支持Kafka源、Kafka接收器和中间状态或状态操作符的一次语义。我们找不到任何地方解释如何使用您在管道中更新的资源执行一次完全相同的操作。有一个twophasecommitsinkfunction,它允许创建一个sink函数,该函数只允许一次语义。
我们无法使用它,因为我们要更新数据库,然后向kafka发出更改通知。在两个独立的接收器中执行此操作将创建竞态条件,在实际更新db之前,我们可以接收一个量级通知。
我们错过什么了吗?有没有办法在map/flatmap操作符中实现两阶段提交?还有别的解决办法吗?
谢谢!
暂无答案!
目前还没有任何答案,快来回答吧!