我希望用Flink替换基于Akka Streams的流处理器的一部分。当前是否可以在同一代码库中将Akka Streams用作Flink的源,然后将Flink用作Akka Streams的源?
Akka Streams的当前流量如下:
// Kafka Source -> Read Flow involving Azure cosmosDB -> Evaluate Flow -> Write Flow -> Logger Flow -> Sink
lazy private val converterGraph: Graph[ClosedShape.type, Future[Done]] =
GraphDSL.create(sink) { implicit builder => out =>
source.watchTermination()(Keep.none) ~> prepareFlow ~> readFlow ~> evaluateFlow ~> writeFlow ~> loggerFlow ~> out
ClosedShape
}
上面的流是这样定义的:
def prepareFlow: Flow[FromSource, ToRead, NotUsed]
def readFlow: Flow[ToRead, ToEvaluate, NotUsed]
现在,我想用Flink流处理器代替它,而不是readFlow
是Akka流。因此,prepareFlow
的输出将是基于Flink的readFlow
的输入,其输出将输入到evaluateFlow
。
基本上,是否可以做这样的事情:
prepareFlow ~> [Flink source ->read -> result] ~> evaluateFlow ~> writeFlow ~> loggerFlow ~> out
我看到Apache Bahir中有一个Flink Akka connector (Sink),但是不确定是否可以将其仅用于Akka演员或流媒体。
答案 0 :(得分:0)
您可以将prepareFlow
从CosmosDB中读取的内容包装为自定义flink Source
(通过扩展SourceFunction
),并将整个评估-记录-记录器流程包装为自定义{{ 3}}。
由于Flink本身是分布式的,因此您将把akka流集成到Flink作业中,反之则不然。我用这种方法看到的主要问题是,akka-stream具有开箱即用的背压,但是Flink本身大部分都是阻塞。例如,SourceFunction.run()方法需要具有一个内部无限循环,该循环在每次迭代时都生成消息,因此您必须在此处进行阻塞以等待akka流在此处生成下一条消息。