Надежное решение для больших динамически генерируемых загрузок в облачной среде? - PullRequest
0 голосов
/ 10 октября 2018

У нас проблемы со стабильностью больших и медленных динамически генерируемых загрузок.Я ищу оптимальное решение, если оно существует.

Пользователи могут выполнять запросы к базе данных и экспортировать полученные документы в ZIP-файл.Запросы могут возвращать миллионы документов, что приводит к большим и медленным загрузкам.Достаточно медленные загрузки всегда терпят неудачу.

У нас есть следующие компоненты:

  • Облачные базы данных
  • Приложение Java EE (CDI, JAX-RS, WebSocket)
  • API WebSocket специально для загрузок
  • Облако Bluemix
  • Синее / Зеленое развертывание через CLI Cloud Foundry
  • Клиент JavaScript

В прошломмы использовали HTTP для загрузки.Мы попробовали Response с MediaType.APPLICATION_OCTET_STREAM и StreamingOutput, а также из JAX-RS.К сожалению, они столкнулись с серьезными проблемами:

  • Недостаточно памяти для буферизации содержимого файла перед помещением их в Response.
  • Bluemix убивает приложение, если на ответ требуется более нескольких минутОтвет.
  • Ограничения HTTP не допускают исключений во время StreamingOutput.HTTP 200, за которым следуют данные, неотличимы от HTTP 200, за которым следуют частичные данные и сообщение об ошибке.
  • Bluemix уничтожает HTTP-соединения после нескольких сотен мегабайт трафика.
  • Bluemix убивает HTTP-соединения через ~ 20 минут.

Чтобы обойти эти проблемы, мы создали решение hack на основе WebSocket.Для каждой загрузки мы генерируем уникальный идентификатор, отправляем данные кусками по 1 МБ и отправляем исключения по боковому каналу.Это решение все еще не идеально:

  • Мы должны объединить фрагменты в памяти клиента.Firefox не поддерживает Streams API.
  • Bluemix по-прежнему прерывает соединение примерно через час.
  • Развертывание прервано при загрузке.
  • Проблемы с соединением прерывают загрузку.

У меня есть несколько идей, как решить эти проблемы:

  • Сериализуемые bean-компоненты, которые можно передавать между серверами.Сериализация и различия версий несколько усложняют это.
  • Центральный сервер загрузки, который является долгоживущим.Проблемы с облаком по-прежнему остаются.
  • Загрузки явно предоставляют чанки, а не поток, разбитый на чанки.Требуется доработка существующих поставщиков загрузки.
  • Клиент создает много запросов на чанки вместо того, чтобы полагаться на открытое соединение.

Однако я не уверен, что делать дальше.У меня нет достаточного опыта работы с облачными инфраструктурами.Я ищу существующие решения и лучшие практики.Конечно, эта проблема должна быть распространенной, чтобы другие люди сталкивались с этими проблемами?Буду признателен за любую помощь, и заранее спасибо!

...