Оптимизация кода свадебного агрегатора на Ruby on Rails

Оптимизация кода свадебного агрегатора на Ruby on Rails

21 марта 2024

«Ссора с женой — как концерт. Сначала новинки, а под конец самые популярные хиты»

народная мудрость

Сайт с говорящим названием WEDby.ME помогает влюбленным воплотить в жизнь свадьбу мечты. В 2020 году благодаря сервису более 850 пар самостоятельно собрали свою свадьбу «под ключ»: от покупки колец до бронирования банкетного зала и проведения шоу-программы. Платье невесты, свадебный букет, фотографа, торт и более 100 000 других товаров от 2 403 компаний можно легко выбрать в одном месте.

На площадке впечатляющий выбор из более чем 900 банкетных залов, 1 500 ресторанов и около 5 000 свадебных платьев. Да что там платья — только аксессуаров для волос представлено 1 174 позиции! Все разнообразие можно отфильтровать с помощью детальных фильтров. Без обручальных колец свадьбы точно не сыграть, а отобрать их можно по цене, виду, материалу, вставкам и их цветам.

На заметку экономным молодоженам: кейтеринг на сайте можно заказать всего от 1 300 руб. на человека. А для невесты, которая хочет поразить гостей своим богатством, в наличии букет «Александрит» за 103 000 руб. Кстати, знали ли вы, что для свадьбы на 100 гостей нужен торт весом 15 кг? Такой торт «Красавец» на сайте тоже присутствует!

Восклицательный знак в заштрихованном круге

Сложно придумать какую-то свадебную услугу, которой нет на сайте WEDby.ME. Мы не смогли. Обязательно напишите нам, если у вас получится.

Обратимся к некоторым статистическим сведениям. По информации РБК, аналитики «Авито Услуг» при анализе 10 000 респондентов по всей России зафиксировали рост спроса на организацию свадеб и выпускных в 2 раза по итогам лета 2023. Наибольший рост отмечается в организации фуршетов (плюс 141% год к году), заказе тамады для мероприятий (плюс 98%) и во всех услугах, связанных с организацией свадеб (плюс 92%). В премиум-сегменте на свадьбы и корпоративы стали чаще приглашать артистов, хотя их гонорары заметно выросли.

Выбор колец для свадьбы
Подбор свадебных колец

В top-5 главных составляющих цены праздника респонденты включили торт (за него проголосовали 42%), цветы (35%), шары (34%), фотографа или оператора (29%) и арендованное помещение (25%). Самостоятельно организацией частных праздников занимается примерно одна пятая часть россиян (22%). Сюда относят тех, кто сам печет торты, покупает букеты в цветочных магазинах, организует фотосъемку и т.д. Остальные 78%, как показало исследование, обращаются за помощью к специалистам.

— Любимый, а нам хватит денег на свадьбу?

— Ну я понемногу откладывал на черный день.

Самыми дорогими праздниками аналитики называют свадьбы. Так, каждый пятый россиянин, сыгравший свадьбу летом 2023 года, потратил на организацию от 100 000 до 300 000 руб., еще почти четверть (23%) — больше 300 000 руб. И 3% опрошенных организовали церемонию за 1 млн руб. и дороже.

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

Букет невесты
Букет невесты

Владельцы компании искали специалистов для доработки и постоянной технической поддержки сайта, написанного на Ruby, Ruby on Rails и JavaScript. Важнейшими составляющими качества онлайн-обслуживания являются быстродействие и удобство использования сайта.

Мы начали аудит с описания тонкостей действующей реализации и создания списка дефектов. Следующим шагом стала подготовка старшим разработчиком подробного технического задания на рефакторинг кода — описаны замечания и методы, содержащие избыточный и неоптимальный код. Заказчик согласовал проведение оптимизации кода интеграции с сервисом BookBanket.

Проблемы производительности

01 Серверный кэш Серверный кэш Оптимизирован серверный кэш, точнее работа с серверным кэшем была полностью удалена, так как использовалась не по назначению.
02 Тормоза рендеринга Задержки рендеринга Второй большой проблемой была чрезмерная задержка серверного рендеринга раздела «Банкетные залы».
03 Фантомный фильтр Фантомный фильтр Третий дефект был связан с внезапным исчезновением ресторанов из раздела «Банкетные залы».
04 Кривая пагинация Ошибки пагинации Исправлена проблема пагинатора и счетчика банкетных залов. Функции работали некорректно, в некоторых случаях показывая произвольные значения.
05 Неоптимальные запросы Неоптимальные запросы Следующая проблема — избыточные и неэффективные запросы к СУБД. Требовались профилирование, отладка и оптимизация запросов.
06 Невозможность развития Невозможность развития Без рефакторинга сервис не был готов к масштабированию, что могло привести к оттоку клиентов.

Рефакторинг кода

Основным достижением рефакторинга было значительное сокращение времени рендеринга раздела «Банкетные залы» на сервере благодаря переносу взаимодействия с сервисом BookBanket в фоновый процесс, выполняющийся по расписанию, тогда как ранее данные получались в режиме реального времени, что сильно тормозило процесс. Параметры заведений, необходимые для сортировки и фильтрации, теперь сохраняются в базу данных сайта, а SQL-запросы были переработаны и оптимизированы.

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

Артист на свадьбу
Выбор артиста

Выявлено несколько таблиц, содержащих устаревшие записи, которые уже не использовались. Для таких таблиц добавлены скрипты очистки и упаковки по расписанию. Например, время простейшего запроса к таблице vieweds составляло 13 секунд, а численность записей — порядка 10 млн. Было прописано удаление записей старше 120 дней, а упаковка таблицы командой VACUUM сократила размер с 9 гигабайт до 37 мегабайт.

До рефакторинга серверный кэш использовался нерационально, не для уменьшения количества запросов API и не для сокращения обращений к базе данных, а как промежуточное средство хранения и передачи данных между множеством методов. Значения из кэша не использовались повторно в процессе серверного рендеринга, а постоянно обновлялись, что не давало какого-либо прироста производительности. По некоторым полям, которые хранились в кэше, требовалось производить сортировку и поиск. Вместо быстрых средств СУБД задача выполнялась на языке прикладного уровня; как результат — усложнение кода, увеличение (а не уменьшение!) количества запросов к базе и потеря производительности. Был удален лишний код, который оказался бессмысленным после рефакторинга.

Банкетные залы для свадьбы
Банкетные залы

Ресторан скрывался, если, например, при запросе по API происходила сетевая ошибка или BookBanket был временно недоступен. Поскольку ошибки носили случайный характер, при запросах одной и той же страницы отображались разные списки заведений.

Помимо рефакторинга были произведены множественные правки в верстке и функционале по нескольким разделам сайта. Исправление дефектов ранжирования банкетных залов по цене и способу расчета стоимости улучшило пользовательский опыт. Добавление SMS-авторизации на сайте также сделало работу пользователя удобнее. И наконец, исправлены ошибки счетчика страниц и пагинатора.

Вместо заключения

«Я свадебный фотограф. И знаете, что в моей профессии самое грустное? То, что у меня есть постоянные клиенты»

Александр Пименов

Есть уверенность, что работы по сайту будут актуальны всегда. Со временем добавятся новые функции, разделы и направления бизнеса. Ведь количество свадеб из года в год в среднем меняется не сильно, а на 10 браков приходится до 7 разводов (статистика Росстата за 2021 год) — то есть пул потенциальных клиентов постоянно пополняется. Значит и работы для свадебных агрегаторов будет предостаточно.