Кеширование файлов и двоичных данных на локальную файловую систему в nodejs

Share and Enjoy !

Shares

Я искал простой пакет в npm, который бы позволил кешировать произвольные двоичные данные (конкретно, изображения) в локальной файловой системе. Я мог бы просто сохранять файлы локально, но написание инвалидации кеша выходила за рамки задачи. В надежде что кто-то уже создал подобный пакет, я поискал в npm. То что я нашёл и на первый взгляд подходило было вот таким пакетом: cache-manager-fs. Я встроил его в проект. Функция обёртки очень удобная, спасибо авторам пакета.

Задача, для которой был нужен кеш, это генерация коллажа из аватарок из соцсетей: поставить на бэкграунд и добавить текст. Выкачивание картинок занимает приличное время, а генерация коллажа занимает процессор. Хорошая идея кешировать и то и то, т.к. дисковое пространство относительно дёшево, для коллажей могут использоваться одни и те-же аватарки, а мы хотим снизить время ответа, т.к. коллажи должны быстро возвращаться, а процессор тоже не резиновый.

После встраивания и тестирования локально я заметил, что генерация занимает 1 секунду на весь запрос, а кешированная версия возвращается за 0.6 секунды. Это всё равно улучшало показатели и снижало трафик, и я задеплоил в прод.

В процессе интеграции я заметил, что кешированный объект хранится в JSON, а двоичные данные (с типом Buffer) преобразуются в объекты с двумя полями: тип и данные. Поле тип содержит строку `buffer`, а данные хранятся как массив байтов, что в формате JSON занимает до 6 раз больше от оригинальных двоичных данных. Так что парсинг buffer в JSON и обратно занимает прилично времени и процессора. Это нужно было исправить. Я решил хранить двоичные данные в отдельных файлах. Такой способ также даёт нам возможность легко обращаться с ними как с потоками, которые можно просто передать в HTTP ответ, сэкономив память.

В итоге вышла система хранения для cache-manager:  cache-manager-fs-binary, основанная на cache-manager-fs.

Что касается результатов. Загрузки было немного, так что график загрузки CPU не сильно изменился, но наименьшее время ответа по кешированному изображению упало с 0.6 с до 0.008 с, а среднее остаётся в районе 0.06 с. Гораздо лучше.

Так что, если вы ищете простое кеширование данных, включая бинарные, рекомендую попробовать cache-manager-fs-binary.

Конечно, есть что улучшить. Комментарии, баги и PR сюда: github repo.

Share and Enjoy !

Shares