Fusion Tech - создаем лучшие решения из ваших идей на основе нашего опыта

Squaded: TDD и микросервисная архитектура для виджета


Squaded - это встраиваемый виджет, работающий на сайтах электронной коммерции одежды и аксессуаров, таких как Zara, Asos. Он позволяет общаться в коммьюнити, сравнивать цены и превращает  скучный поиск и подбор нужного товара в развлечение. 

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

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

В проекте реализована микросервисная архитектура, состоящая из 6 микросервисов, каждый из которых отвечает за определенные задачи в приложении. Подобная архитектура была выбрана, исходя из следующих преимуществ: 

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

Что касается технологий, используемых на проекте, здесь выбор пал на TypeScript + Vue.js во фронтенде, TypeScript + Node.js в бэкэнд части, в качестве базы данных была выбрана MongoDB, позволяющая легко и быстро масштабировать проект при росте нагрузки. Все это было развернуто (deploy) в AWS EC2, использовались многие ее сервисы, например S3 для хранения фоток пользователей, SES для почтовой рассылки, Rekognition  для фильтрации нежелательного контента итд.  Что касается альтернативы MongoDB от AWS - DocumentDB, она не подошла из-за отсутствия поддержки некоррелируемых запросов (multiple join conditions and uncorrelated subquery) о задачах.

Для увеличения эффективности при хайлоад нагрузке мы решили обращаться к Mongo API напрямую, т.к. ORM-системы типа Mangoost не могут обеспечить нужный уровень при большом количестве JOIN (lookup) запросов. Одна из самых трудных задач - формирование и профилирование сложных запросов с участием нескольких таблиц (коллекций) (до 7). 

Чтобы добиться хорошей скорости выполнения запросов, была использована конвейерная обработка - Mongo Aggregate - некоторые из конвейеров  имели около 20 стадий. Написание кода для этих функций с последующей отладкой и профилированием для более эффективной работы стало одной из сложнейших задач на проекте и, конечно, потребовала использования специальных инструментов и сервисов - таких как Studio 3T для написания и отладки aggregate-запросов; и AWS CloudWatch и Metrics - для логирования и оценки скорости работы запросов, обеспечив, в конечном итоге, быструю обработку очередей запросов, и высокую отзывчивость системы на действия пользователей.

В связи с постоянным добавление новых фич при необходимости сохранения 24-часовой работоспособности проекта, одним из требований  заказчика было покрытие всего кода Unit-тестами в соответствии с концепцией TDD.  Для этого пришлось создавать довольно сложные mock-функции для эмулирования взаимодействия с MongoDB, Redis и остальными микро-сервисами.

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

Юрий
Юрий РАЗРАБОТЧИК
Есть проект для нас?
обработку персональных данных
Вы должны принять соглашение
Подтвердите что вы не робот
Ваша заявка отправлена
Отправляется...