我需要构建以下图表:
val graph = getFromTopic1 ~> doSomeWork ~> writeToTopic2 ~> commitOffsetForTopic1
但是试图在Reactive Kafka中实现它让我失去了一个兔子洞。这似乎是错误的,因为这让我觉得这是一个相对常见的用例:我希望在保证至少一次交付语义的同时在Kafka主题之间移动数据。
现在并行编写
完全没问题val fanOut = new Broadcast(2)
val graph = getFromTopic1 ~> doSomeWork ~> fanOut ~> writeToTopic2
fanOut ~> commitOffsetForTopic1
此代码有效,因为writeToTopic2
可以使用ReactiveKafka#publish(..)
实现,Sink
会返回Flow.fromSinkAndSource(..)
。但是当我的应用程序崩溃时,我失去了ALOS保证,因此失去了数据。
所以我真正需要的是编写一个写入Kafka主题的Flow。我尝试将GraphStage
与自定义commitOffsetForTopic1
一起使用,但遇到了流经数据的类型问题;例如,writeToTopic2
中提交的内容不应包含在writeToTopic2
中,这意味着我必须保留一个包含两个数据片段的包装器对象。但这与ProducerMessage[K,V]
接受stmt->execute()
的要求相冲突。我最近解决此问题的尝试遇到了反应性kafka库中的私有和最终类(扩展/包装/替换底层的SubscriptionActor)。
我真的不想维持一个分叉来实现这一目标。我错过了什么?为什么这么难?我在某种程度上试图建立一个病态图节点,或者这个用例是一个疏忽......还是有一些完全明显的东西我在某些方面错过了我一直在挖掘的文档和源代码?
当前版本为0.10.1。我可以根据要求添加更多关于我的许多尝试的详细信息。