Потоки Akka - можно ли масштабировать как обычных актеров или как-то иначе?

У меня есть код, выполняющий конвейер с использованием потоков Akka.

Мой вопрос в том, как лучше масштабировать его? Можно ли это сделать и с помощью потоков Akka?

Или его нужно преобразовать в акторов/другим способом?

Фрагмент кода:

val future = SqsSource(sqsEndpoint)(awsSqsClient)
.takeWhile(_=>true)
.map { m: Message =>
(m, Ack())
}.runWith(SqsAckSink(sqsEndpoint)(awsSqsClient))

person john    schedule 21.08.2017    source источник


Ответы (1)


Если вы немного измените свой код, ваш поток будет материализован в несколько значений Actor. Эти материализованные акторы обеспечат вам параллелизм, который вы ищете:

val future = 
  SqsSource(sqsEnpoint)(awsSqsClient)           //Actor 1
    .via(Flow[Message] map (m => (m, Ack())))   //Actor 2
    .to(SqsAckSink(sqsEndpoint)(awsSqsClient))  //Actor 3
    .run()

Обратите внимание на использование via и to. Они важны, потому что указывают на то, что эти стадии потока должны материализоваться в отдельных Актеров. В вашем примере кода вы используете map и runWith для Source, что приведет к созданию только 1 Актера из-за слияние операторов.

Потоки, которые обращаются к внешним субъектам

Если вы хотите расширить еще больше Актеров, вы можете использовать Flow#mapAsync для запроса внешнего Актера для выполнения дополнительной работы, аналогично этот пример.

person Ramón J Romero y Vigil    schedule 22.08.2017
comment
значит ли это, что максимальная степень параллиза равна 3? можно больше? - person john; 22.08.2017
comment
@john Обновлен ответ, чтобы отразить больше асинхронных возможностей. - person Ramón J Romero y Vigil; 22.08.2017