Автоматизация складского учёта интернет-магазина
Корпоративная система двунаправленной синхронизации товаров компании в Shopify и ERP.
Aizel - это концепт-стор современной брендовой и дизайнерской одежды. Для экспансии на зарубежный рынок компания решила разработать сайт на платформе Shopify, для которого мы разработали интеграцию с уже имеющей системой складского учёта.
Перед нами стояла амбициозная цель - связать две независимые системы, одна из которой находится в руках вендора, чтобы они синхронизировались друг с другом и покупка, добавление, изменение товаров в одном сервисе отражались на другом сайте.
В чём была сложность
На момент проведения работ не существовало готового решения для синхронизации товаров между двумя системами. Нам предстояло разработать полностью кастомное решение.
Помимо прочего, задача при детальном рассмотрении не была такой простой как может показаться на первый взгляд. Нам пришлось преодолеть ограничения Shopify на количество запросов в секунду, возможные коллизии при одновременных изменениях в двух системах, а также организовать стабильную систему с высоким аптаймом. Критические баги в основной части системы интернет-магазина могли сильно повлиять на репутацию и доход компании.
Как мы это решили
Ограничения Shopify и стабильность
Во-первых всю обработку веб-хуков мы выводили в отдельные потоки и моментально отдавали 200-ый ответ. Во-вторых, мы формировали очередь запросов на обработку, которая хранилась в базе данных.
Таким образом мы избавлялись от таймаутов, когда нам нужно было долго обрабатывать запросы, например, из-за ретраев, а при возникновении ошибок не теряли данные запросов и могли восстановить их обработку из очереди.
Транзакционность
Нам было крайне важно обеспечить корректность отображаемых данных в разных системах. Мы старались придерживаться принципов ACID, но всё осложнялось тем, что у нас не было возможности изменять код систем, которые непосредственно вносили изменения в базы данных.
Несмотря на это, мы смогли обеспечить актуальность данных следующим образом:
Atomicity
На каждое действие мы формировали и сохраняли roll-back последовательности. Это включало в себя и http запросы к Shopify или ERP и откаты локальной базы данных коннектора.
Consistency
Нетривиальными алгоритмами обеспечивали целостность базы данных. Не только проверяли банальности вроде невозможности вставить отрицательное значение в поле количества товара, но и в общем обеспечили возможность отменять невозможные заказы, например, когда в одной системе товар уже закончился, а в другой эти изменения ещё не появились.
Isolation & Durability
Изолированность и надёжность обеспечили при помощи очередей, алгоритм которых был описан выше. Тут, конечно, полноценной имплементации подходов не получилось, так как, например, в системах было доступно то же самое "грязное чтение", но в рамках технических ограничений, это лучшее, чего мы могли достичь.
Прочие компоненты системы
Остальные части системы были достаточно тривиальными - API для CRUD операций, front-end админ панели и прочий типовой функционал, который было достаточно просто интегрировать с интерфейсами взаимодействия Shopify и Aizel.
Результат
В итоге, несмотря на значительные технические ограничения, с которыми нам пришлось столкнуться, мы реализовали полностью автоматизированную систему синхронизации двух систем, что позволило интегрировать в бизнес Aizel ещё дополнительный канал продаж без необходимости привлечения дополнительных сотрудников для контроля учёта в системе.