Play Framework: как бороться с объемными действиями? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть приложение Play Framework (Play 2.8, Scala 2.13 и Java 8), которое создает миниатюры JPG из загруженных файлов PDF, используя Apache PDFBox 2. Миниатюры создаются по запросу, затем кэшируются в файловая система. Однако, когда один пользователь пытается отобразить галерею со многими PDF-файлами, для которых не кэшируются миниатюры, одновременно создается несколько миниатюр, и сервер вылетает с OutMemoryError (кажется, достаточно 5 или 6 одновременных задач). Сервер перезагружается автоматически и снова становится доступным через несколько десятков секунд, но создаваемые миниатюры повреждены, и мне приходится сталкиваться со многими недоступностями.

PDFBox настроен на использование временных файлов, но память не используется происходит при рендеринге миниатюрного изображения.

На сервере доступно только 2 ГБ ОЗУ. Размер загруженного файла PDFS составляет около 1 МБ, а размер созданных миниатюр - около 100 КБ (72 DPI; размер около 500 × 1000 пикселей). Можно ли исправить эту проблему без увеличения размера кучи? В идеале Play должен иметь возможность автоматически ставить в очередь эти запросы с интенсивным использованием памяти, но я могу жить, ограничивая количество одновременных задач с интенсивным использованием памяти вручную, каким-то образом ...

1 Ответ

1 голос
/ 04 марта 2020

Возможно, проще всего будет использовать выделенный ExecutionContext с базовым пулом потоков фиксированного размера для генерации миниатюр.

import java.nio.file.Path
import java.util.concurrent.Executors

import scala.concurrent.{ ExecutionContext, Future }

object RenderPDF {
  implicit val ec : ExecutionContext = ExecutionContext.fromExecutorService(Executors.newFixedThreadPool(3 /* adjust */))

  def thumbnail(pdf: Path) : Future[Path] = Future {
    ... // call PDFbox
  }
}

Вы можете использовать это в своем обработчике действий, чтобы выключить генерацию миниатюр.

Вероятно, было бы даже лучше предварительно отрисовать миниатюры в случае, если вы имеете дело с загруженными PDF-файлами, поскольку это позволило бы избежать проблемы внезапной визуализации десятков PDF-файлов, если пользователь открывает галерея.

...