В начале 2021 года мы начали поддержку интернет-магазина крупного российского FMCG-ритейлера. С каждым годом его бизнес-показатели электронной коммерции набирают обороты, поэтому начали появляться узкие места в работе сайта.
Анализ текущей интеграции через REST запросы в Magento API
Мы приступили к анализу и проектированию. В старой реализации использовался импорт продуктов через RESTful API Magento, что автоматически накладывало большие ограничения как к пропускной способности импорта, так и к стабильности его в целом. Так же было замечено, что в глубине интеграции использовалась обычная функциональность импорта Magento, которая из коробки заточена только на редкие обновления пакетами из файла, но никак не подходит для регулярного обновления/добавления продуктов запросами REST.
Бенчмарки импорта: Простой продукт, добавление - 2 с Простой продукт, обновление - 1.5 с Сложный продукт, добавление - 8 с Сложный продукт, обновление - 6 с
Под сложным продуктом понимается конфигурируемый, состоящий из нескольких простых. Например, шампуни могут быть 300ml, 500ml и 1000ml - это всё один конфигурируемый товар из нескольких простых.
Повышение отказоустойчивости путем перевода на асинхронный импорт
Первым шагом оптимизации мы решили отказаться от синхронного подхода с REST в сторону асинхронного через очереди Kafka. Это позволило нам иметь возможность просмотра истории сообщений, повторно импортировать нужные сообщения (пришедшие из других систем данные), что сильно подняло стабильность - вероятность утраты данных стала близка к нулю.
Также мы реализовали батчинг (пакетную обработку) сообщений, чтобы импорт Magento получал продукты в привычном ему виде и получили прирост в 70%, что уже больше целевого прироста оптимизации, поставленного изначально.
Отказ от стандартного импорта и перевод его на точечные импорты напрямую в базу данных (ускорение на 400%)
Следующим шагом мы решили отказаться от Magento импорта и перейти на импорт прямыми запросами в базу, так как в самой Magento реализовано очень много дополнительной логики и проверок, которые не нужны нашему клиенту. Мы полностью переписали интеграцию простых продуктов и логику обновления конфигурируемых. В итоге получили суммарный прирост на 400% относительно старого решения.
Новые бенчмарки импорта: Простой продукт, добавление - 1с Простой продукт, обновление - 200-300 мс Сложный продукт, добавление - 3 с Сложный продукт, обновление - 300-500 мс
Реализация полного маппинга контракта из PIM с атрибутами в Magento. С созданием опций атрибутов и брендов на лету (порядка 200 новых значений ежедневно при общем количестве ~200.000)
Следующей задачей бизнеса стала реализация маппинга атрибутов и создание опций атрибутов на лету со стороны Magento. Данная потребность возникла из-за появления большего количества потребителей данных из PIM. Ответственность за подготовку данных перешла на потребляющие системы, и Magento не стала исключением.
Мы реализовали удобный маппинг, позволяющий сопоставить любой приходящий контракт с любым списком атрибутов с теми, что созданы в Magento. Сам маппинг отрабатывает за 30мс на каждое приходящее сообщение из Kafka.
В результате работы нашего решения в Magento на данный момент создано порядка 200.000 новых опций атрибутов и прирост каждые сутки порядка 500.
Мгновенная актуализация витрины из DAX365
Последним этапом нашего погружения в работу продуктов в системе стала актуализация витрины интернет-магазина. После общения с рядом представителей контент направления было выяснено, что включение продуктов сейчас никак не зависит от наличия остатков, цен, ассортимента и тд и в основном происходит в ручном режиме, что сильно увеличивает вероятность человеческой ошибки и попадания некорректных продуктов на витрину.
В рамках задачи по актуализации мы перевели все импорты из DAX (цены, ассортименты и стоки) на очереди из Kafka, что улучшило стабильность системы работы с продуктами. Также реализовали включение продуктов по триггерам, чтобы полностью автоматизировать этот процесс при появлении необходимых данных по товару.
Теперь время включения продукта, готового к продажам, измеряется секундами, а не днями в случае ручного включения.