🔧 Оптимизация создания отчетов с использованием YDB
Сегодня продолжил работу над оптимизацией создания отчетов. Решил, что можно написать хитрые запросы к базе данных YDB, чтобы вычисления происходили на стороне базы, а мне приходил готовый результат.
Я успешно написал запросы для ежедневных и еженедельных отчетов. Однако с ежемесячными возникла проблема. При создании интервала с помощью INTERVAL("P2M") возникла ошибка: "Invalid value 'P1M' for type Interval". Хотя в документации указано, что можно создавать интервалы из строкового литерала в формате ISO 8601.
Я обратился за помощью в Telegram-группу, посвящённую YDB, и добрый человек подсказал, что работают только периоды до дня и недели. К сожалению, для более длительных периодов это не сработает. Я сделал форк репозитория YDB, внёс правки в документацию и оформил pull request.
В результате переписал формирование интервалов в серверлесс-функциях, чтобы было удобно использовать для разных периодов. Учёл, что данные в базе хранятся по UTC, а запрашивать нужно по +3. Для работы с датами использовал легковесную библиотеку dayjs. Протестировал формирование интервалов в облаке, чтобы убедиться, что всё работает корректно.
Также в функции перешёл с Node.js 16 на 18, что позволило использовать нативный fetch и отказаться от сторонних библиотек. Добавил повторные запросы в случае ошибок, так как у шлюзов Яндекса есть известные проблемы, и тикет по этому поводу висит у меня уже больше года.
Кроме того, перешёл с самописного логгера на pino, для которого у меня написаны транспорты для логирования в Yandex Logging и Telegram. Провёл рефакторинг запросов данных по интервалам из базы и группировки их по типам соцсетей.
Эти изменения значительно улучшат производительность и надежность отчетов! 💪