是否可以在Akka Streams流之间将Flink流处理器用作源和接收器?

时间:2019-04-23 17:41:38

标签: stream akka apache-flink

我希望用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演员或流媒体。

1 个答案:

答案 0 :(得分:0)

您可以将prepareFlow从CosmosDB中读取的内容包装为自定义flink Source(通过扩展SourceFunction),并将整个评估-记录-记录器流程包装为自定义{{ 3}}。

由于Flink本身是分布式的,因此您将把akka流集成到Flink作业中,反之则不然。我用这种方法看到的主要问题是,akka-stream具有开箱即用的背压,但是Flink本身大部分都是阻塞。例如,SourceFunction.run()方法需要具有一个内部无限循环,该循环在每次迭代时都生成消息,因此您必须在此处进行阻塞以等待akka流在此处生成下一条消息。