У нас проблемы со стабильностью больших и медленных динамически генерируемых загрузок.Я ищу оптимальное решение, если оно существует.
Пользователи могут выполнять запросы к базе данных и экспортировать полученные документы в 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-компоненты, которые можно передавать между серверами.Сериализация и различия версий несколько усложняют это.
- Центральный сервер загрузки, который является долгоживущим.Проблемы с облаком по-прежнему остаются.
- Загрузки явно предоставляют чанки, а не поток, разбитый на чанки.Требуется доработка существующих поставщиков загрузки.
- Клиент создает много запросов на чанки вместо того, чтобы полагаться на открытое соединение.
Однако я не уверен, что делать дальше.У меня нет достаточного опыта работы с облачными инфраструктурами.Я ищу существующие решения и лучшие практики.Конечно, эта проблема должна быть распространенной, чтобы другие люди сталкивались с этими проблемами?Буду признателен за любую помощь, и заранее спасибо!