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