Масштабируемость для интенсивных задач генерации PDF в приложении node.js с использованием puppeteer? - PullRequest
0 голосов
/ 04 февраля 2019

Цель приложения - сгенерировать PDF-файл с помощью puppeteer, мы извлекаем данные, создаем HTML-шаблон, а затем с помощью Chrome Headless генерируем PDF, а затем возвращаем ссылку на вновь созданный PDF-файл.

Проблема заключается в том, что для генерации pdf требуется около 7000 мс, в основном из-за трех функций кукловода: запуск (запуск безголового обозревателя), goto (переход к шаблону html) и pdf (генерирование pdf).

Таким образом, имея около 7 ~ 8 секунд для ответа на один запрос, с большим количеством входящих запросов или внезапным всплеском, для 30 одновременных запросов может потребоваться около 40–50 секунд, что я считаю неприемлемым.

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

Но кроме кластеризации, есть ли другие возможные варианты для оптимизации времени на одном экземпляре?

1 Ответ

0 голосов
/ 04 февраля 2019

Есть что рассмотреть ...

  1. Подумайте о том, чтобы вызывать puppeteer.launch один раз за запуск приложения.Ваш скрипт преобразования просто проверит, существует ли экземпляр браузера, и использует его, вызывая newPage(), что в основном создает новую вкладку, а не каждый раз при создании браузера.
  2. Вы можете рассмотреть возможность перехвата Request как page.on('request', this.onPageRequest); при вызове goto() и отфильтровывать определенные типы файлов, страница которых загружается прямо сейчас, но они вам не нужны для рендеринга PDF;Вы также можете отфильтровать внешние ресурсы, если это ваш случай.
  3. При использовании pdf() вы можете вернуть Buffer из вашего сервиса вместо использования файловой системы и вернуть ссылку на местоположение файла PDF.создано.это может или не может ускорить вещи, зависит от настройки вашего сервиса;в любом случае меньше IO должно быть лучше.

Это, вероятно, все, что вы можете сделать для одного экземпляра вашего приложения;С приведенной выше реализацией обычный (пара страниц) PDF с несколькими изображениями рендерится для меня за 1-2 секунды.

Для ускорения работы используйте кластеризацию.Кроме встраивания его в ваше приложение, вы можете использовать менеджер PM2 для запуска и масштабирования нескольких экземпляров вашего сервиса.

...