Akka Stream - 如何从多个SQS源流式传输

时间:2018-02-14 21:41:26

标签: scala akka akka-stream alpakka

这是Akka Stream - Select Sink based on Element in Flow的后续帖子。

假设我有多个SQS队列,我想从中流式传输。我使用Alpakka的AWS SQS Connector来创建Source

implicit val sqsClient: AmazonSQSAsync = ???
val queueUrls: List[String] = ???
val sources: List[Source[Message, NotUsed]] = queueUrls.map(url => SqsSource(url))

现在,我想combine合并它们的来源。但是,Source.combine方法不支持将列表作为参数传递,但仅支持varargs。

def combine[T, U](first: Source[T, _], second: Source[T, _], rest: Source[T, _]*)(strategy: Int ⇒ Graph[UniformFanInShape[T, U], NotUsed])

当然,我可以手指输入所有来源参数。但是,如果我有10个源队列,参数将会很长。

有没有办法合并来源列表中的来源?

[补充]

正如Ramon J Romero y Vigil所指出的那样,保持流"薄薄的单板"是一种更好的做法。但是,在这种特殊情况下,我使用单sqsClient进行所有SqsSource初始化。

1 个答案:

答案 0 :(得分:3)

您可以使用foldLeft来连接或合并来源:

val sources: List[Source[Message, NotUsed]] = ???

val concatenated: Source[Message, NotUsed] = sources.foldLeft(Source.empty[Message])(_ ++ _)
// the same as sources.foldLeft(Source.empty[Message])(_ concat _)

val merged: Source[Message, NotUsed] = sources.foldLeft(Source.empty[Message])(_ merge _)

或者,您可以将Source.zipNflatMapConcat

一起使用
val combined: Source[Message, NotUsed] = Source.zipN(sources).flatMapConcat(Source.apply)