Разбор и сохранение файла в akka http - PullRequest
0 голосов
/ 03 июля 2019

Мне нужно создать сервер на основе akka http, который будет принимать файлы xml и сохранять их в S3, тот же файл анализируется, и его данные отправляются вasticsearch. Я впервые работаю с этими технологиями, поэтому заметил, что есть разъемы Alpakka для Elassearch и S3. Так как это не большие xml-файлы, мне интересно, стоит ли обрабатывать все эти шаги через потоки akka? Я думаю о том, чтобы сделать это или загрузить файлы в память с помощью toStrict, проанализировать их, а затем сохранить их не обязательно с помощью соединителей alpakka.

Что мне нужно, так это несколько советов о том, как думать об этом и когда следует подумать об использовании потокового соединителя, например для эластичного поиска или просто простого клиента, такого какastic4s.

Надеюсь, я был достаточно ясен.

1 Ответ

0 голосов
/ 09 июля 2019

Трудно ответить, стоит ли решение akka-stream «того», не зная, как измерить стоимость и выгоды. Но объем кода для потокового решения эквивалентен toStrict решению.

A Route может получить entity в виде потока и затем использовать BroadcastHub для отправки данных в два разных приемника:

val route : Route = extractDataBytes { data =>
  val runnableGraph = data.toMat(BroadcastHub.sink(bufferSize = 256))(Keep.right)

  val s3Sink : Sink[ByteString, Future[Done]] = ???

  val elasticSearchSink : Sink[ByteString, Future[Done]] = ???

  val fromData = runnableGraph.run()

  val s3Fut      = fromData.runWith(s3Sink)
  val elasticFut = fromData.runWith(elasticSearchSink)

  for {
    _ <- s3Fut
    _ <- elasticFut
  } yield complete(StatusCode.Ok)
} 
...