Николай Ланец
2 июня 2019 г., 19:59

@prisma-cms/front-1.17.0 Значительно улучшена производительность

Всем привет!

Сегодня столкнулся вот с какой ситуацией: на одном из проектов при импорте данных из excel-файла (заказы и товары в заказах) ощутилась весьма серьезная нагрузка на странице браузера. Стал разбираться и выяснил, что во фронте для интерактивности навешана подписка на изменения данных с сервера и когда на сервере создается или обновляется заказ или позиция в заказе, в браузер по веб-сокету прилетает уведомление и там происходит переподгрузка данных и прочая магия. А тут загружается ~150 заказов и порядка 1000 позиций, то есть это более 1000 уведомлений в браузер и реинициализаций на странице (конечно же столько выполняется только у админа, так как простые пользователи получают уведомления только по своим заказам, но тем не менее, даже для одного пользователя такого происходить не должно). Стал разбираться. Отметил, что хотя в ответ на уведомления на сервер отправлялось совсем немного запросов на подгрузку данных (что было и раньше), нагрузка все же была и она явно связана с недавним новшеством в @prisma-cms/front - использованию API-схемы, подгружаемой с сервера. Схема эта довольно большая (в несжатом виде порядка 2Мб), а главное - в кеш apollo-client добавляется порядка 30 000 ключей со значениями. И получилось, что при обновлении данных, обновлялась и API-схема, что в свою очередь и давало большую нагрузку на вычисления (аполло-клиенту же надо проверить, что есть в кеше, а чего нет, получить данные, обработать, сравнить, закинуть новые данные в кеш и т.п.). В общем, пришлось повозиться, но исправить ситуацию получилось. Теперь на сервере в режиме SSR эта схема запрашивается один раз, после чего полученная схема переводится в JSON-строку и сохраняется в переменную, которая в дальнейшем уже при каждом запросе добавляется в документ без повторных запросов к API-серверу и преобразований этой схемы. В браузер загружается HTML-документ уже с этой схемой и на сервер более запросов не выполняется. В итоге любая операция с аполло-клиентом и кешем никак не затрагивают не касаются схемы и нагрузка сильно упала. Теперь 1000 уведомлений в минуту об обновленных данных и реагирование на них - не проблема.

По поводу размера HTML-документа: хотя схема в исходном виде и весит метра два (а плюс к этому еще и сам HTML-документ с готовым кешем API-данных), реальный объем передаваемых данных значительно меньше за счет gzip-сжатия на уровне nginx. В моем случае при реальном размере страницы в 3Мб в сжатом виде это всего 102кб.

Но помимо производительности тут еще и правильность работы значительно улучшилась. Дело в том, что от этой схемы зависит работа нескольких компонентов (в частности фильтры @prisma-cms/filters и Query из @prisma-cms/front-editor). Если не будет схемы, то они не смогут получить данные и в таких случаях они просто ничего не выводят. И вот получалось, что когда выполнялось обновление данных, возникали ситуации, когда хоть и на секунду-другую, но схема пропадала, из-за чего отдельные части страницы пропадали, что совсем нехорошо. Теперь такой ситуации не возникает.

Сильно в дебри не буду лезть, но если кому интересно, изменения на уровне этих двух коммитов:

Добавить комментарий