Увеличение скорости обновления информации в 100 раз за счет миграции данных из хранилища на базе СУБД PostgreSQL

Ранее мы уже описывали архитектуру мультиязычного сайта с большим количеством магазинов в разных странах.

Перед нашим клиентом, компанией Levenhuk, встала задача обновления и модернизации текущего самописного хранилища на СУБД Postgres.

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

Нашли довольно быстрое и нестандартное решение – самописное хранилище данных на СУБД Postgres мигрировать в БУС (Битрикс: Управление Сайтом), заменив сущности на инфоблоки и HL-блоки.

Бизнес-задача

Исходя из текущей архитектуры проекта

Архитектура веб-проекта
Архитектура веб-проекта

Задачи перед нами стояли следующие:

  • Создать одну платформу, которая бы могла гибко работать в среде заказчика, легко интегрируясь в новые продукты.
  • Оптимизировать способ обновления товаров (в старой архитектуре на обновление товаров могло уйти до 20 часов).

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

Почему решили что-то менять?

В самописном хранилище на СУБД Postgres содержатся данные, для “обогащения” сайта информацией о свойствах товаров. И один из критических моментов с масштабированием проекта — это увеличение памяти под каждый сайт. Требуется гораздо больше памяти — как оперативной, так и постоянной (эта проблема, в целом, решаема, и не такая страшная). Но основная причина экономическая:

  • старая админка;
  • слабая поддержка;
  • бизнесу нужно больше изменений, гибче настройки.

Архитектура Enrich

Enrich — агент на сайте, который следит за товарами. Он их “обогащает” переводами (много языковых версий), свойствами из HL-блоков и “включает”. Чтобы не вдаваться в детали, приведем схему первой версии работы Enrich в связке с PostgreSQL.

Архитектура работы Enrich
Архитектура работы Enrich

Мы убрали скрипт импорта товаров, и стали их записывать в HighLoad блоки (ХЛБ) из которых Enrich брал информацию и распределял между SKU и товарами.

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

Ключевая задача — это добавление mapper’ов ( один из подвидов воркеров). Их роль – распараллелить процессы обновления информации. Одни воркеры занимаются обновление SKU, другие занимаются привязкой данных товаров и т.п.

В нашем представлении Enrich должен быть оптимизирован по следующей схеме:

Оптимизация работы Enrich
Оптимизация работы Enrich

Что это даст? Как минимум оптимизирует хранение всех данных в БД, а также ускорит процесс обновления информации на стороне сайта (многократно).

Если разбивать по шагам, то получается следующий порядок процесса рефакторинга:

  • При импорте из 1С GUID раздела сохранять в SKU.
  • Настроить ActiveMQ для enrich.
  • Добавить mapper'ы, которые объединяют SKU в рамках товаров.
  • Разместить модуль enrich в отдельный репозиторий (B2B, B2C).

Что будем переносить из PostgreSQL?

Переносим все поля свойств из PostgreSQL на highload-блок Битрикса, так называемый LOC. Простой, но в тоже время самый трудоемкий процесс, т.к. текущие таблицы очень большие и необходимо правильно и в той же последовательности связать их в highload-блок Битрикса, чтобы не нарушить целостность системы.

По сути перенеся все данные, мы можем отрубать PostgreSQL и пользоваться её аналогом в среде Битрикс и дальнейшей докруткой визуальной части системы.

Как выглядит обмен данными теперь

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

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

Оптимизация бизнес-процессов
Оптимизация бизнес-процессов

LOC — это и есть наш аналог PostgreSQL на Битриксе. В нем содержатся данные для сайта, такие как: Файлы, изображения, свойства товаров, адреса складов/салонов. В Enrich у нас уходят только свойства и адреса. Если прям совсем подробнее то вот к такой схеме работы связки LOC-Enrich мы пришли:

Схема работы LOC-Enrich
Схема работы LOC-Enrich

Выводы

На текущий момент экосистема работает. Результаты:

  • Если товар изменили на стороне LOC, то практически моментально идет обновление на всех сайтах (если очередь забита, самая длинное обновление составляло ~10 мин, ранее это могло занимать до 20 часов).
  • Уменьшили нагрузку на сервер и избежали пиковых нагрузок. Если раньше нагрузка росла пропорционально кол-ву языковых сайтов (запускается новая языковая версия сайта, включаем еще один экземпляр скрипта для нового сайта), то теперь количество запущенных скриптов (воркеров) постоянно. Так же все обрабатывается параллельно. В цифрах нагрузка с 52% уменьшилась до 23-25%.
  • Аналог PostgreSQL на Битриксе оптимизирует хранение данных (если раньше все свойства занимали место на сервере ~800Гб, то теперь ~300Гб).
5 комментариев

Кажется у "компетентного веб-интегратора" не так много компетенций, если допускает опечатки вида "СУБД Postgre"...

Ответить

Добрый день! Вас смутило отсутствие SQL? Для понятности и короткого заголовка написали специально так, в самом тексте указано верно.

Ответить