Потоковая передача объектов JSON с использованием фрагментированного ответа akka http

Это злоупотребление или как-то опасно использовать akka-http таким образом?

На сервере

def source(consumerOffset: UUID) = 
  readJournal.eventsByTag(“MyTag", consumerOffset).map(_.asJson)

pathPrefix("stream" / Segment.map(UUID.fromString)) { offset =>
  pathEndOrSingleSlash {
    get {
      complete {
        HttpResponse(
          StatusCodes.OK,
          entity = HttpEntity(ContentTypes.`application/json`, source(offset))
        )
      }
    }
  }
}

Затем на стороне клиента

Source.single(HttpRequest("http://localhost:9000/stream"))
  .mapAsync(1) { r =>
    Http().singleRequest(r).map { res =>
      res.entity.dataBytes.map(_.parse[Event])
    }
  }
  .flatMapConcat(identity).mapAsync(processEvent)

UPD:

  1. Гарантировано ли, что отправленные мной куски будут такими же на стороне клиента?
  2. Можно ли получить ответ, содержащий, возможно, бесконечное количество блоков?
  3. Каков правильный Content-Type для такого ответа?

UPD 2:

В Akka 2.4.9 добавлена ​​возможность отвечать потоками. И в основном делает то же самое, обеспечивая некоторый синтаксический сахар. См. документы. .


person Denis Mikhaylov    schedule 05.07.2016    source источник
comment
Что вас беспокоит? На первый взгляд все это похоже на котел ...   -  person Ramón J Romero y Vigil    schedule 05.07.2016
comment
1. Гарантировано ли, что отправляемые мной куски будут такими же на стороне клиента?   -  person Denis Mikhaylov    schedule 05.07.2016
comment
2. Можно ли получить ответ, содержащий, возможно, бесконечное количество блоков?   -  person Denis Mikhaylov    schedule 05.07.2016
comment
Я обновил вопрос.   -  person Denis Mikhaylov    schedule 05.07.2016
comment
@DenisMikhaylov В дополнение к этому, что произойдет, если клиент закроет соединение в ч / б, но сервер не имеет возможности узнать об этом, сервер думает, что клиент просто медленно потребляет, и продолжает буферизовать ответ. Как справиться с этими сценариями?   -  person curious    schedule 26.06.2017
comment
@curious Для таких сценариев есть настройка idle connection timeout   -  person Denis Mikhaylov    schedule 26.06.2017


Ответы (1)


Отвечая на ваши вопросы по порядку:

  1. Да, клиент получит BytesString представление ваших объектов в кодировке json.
  2. Да, это нормально, если на стороне сервера есть источник потока, который никогда не завершается.
  3. Содержание, указанное вами в вопросе (application/json), является правильным.
person Ramón J Romero y Vigil    schedule 05.07.2016