{"id":14275,"url":"\/distributions\/14275\/click?bit=1&hash=bccbaeb320d3784aa2d1badbee38ca8d11406e8938daaca7e74be177682eb28b","title":"\u041d\u0430 \u0447\u0451\u043c \u0437\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0430\u0432\u0446\u044b \u0430\u0432\u0442\u043e?","buttonText":"\u0423\u0437\u043d\u0430\u0442\u044c","imageUuid":"f72066c6-8459-501b-aea6-770cd3ac60a6"}

От монолита к микросервисам. Как упростить и ускорить работу онлайн-магазина продуктов

Опыт «Утконоса».

Уже 21 год компания «Утконос ОНЛАЙН» доставляет продукты жителям Москвы и области. Мы были одними из первых на рынке: в нулевых наши клиенты выбирали товары из печатного каталога, делали заказ по телефону и потом забирали его в пунктах выдачи. С тех пор многое изменилось: сейчас на нашем сайте более 70 тысяч товаров, которые мы можем привезти за два часа, а в год доставляем около 3 млн заказов. В блоге компании будем рассказывать о том, как эти изменения стали возможны.

Начинаем блог с разговора про бэкэнд: директор ИТ-департамента Мария Артамонова делится опытом перехода от неповоротливого приложения к быстрым сервисам, которые подстраиваются под любые бизнес-задачи.

Бизнес хотел, чтобы мы менялись быстрее

Монолитом называют продукт, все компоненты которого взаимосвязаны и взаимозависимы. Если один не работает, то не работают и все остальные.

Микросервисы — небольшие, автономные сервисы, которые работают совместно и нацелены, как правило, на выполнение одной задачи.

Мы поняли, что пора «распиливать» монолит, когда доработка любой функции приложения стала занимать слишком много времени. Создание каждой новой функции с нуля занимало неделю, а полноценный регресс — несколько месяцев. Было сложно вносить даже самые небольшие изменения, так как потом приходилось тестировать практически всю систему, чтобы убедиться, что ничего не сломалось.

Монолит можно сравнить с большой коробкой, которая состоит из других маленьких коробок случайного размера. Они связаны между собой переплетённой логикой, и изменение любой из них меняет объём самой коробки. Отсюда медлительность и негибкость.

Например, раньше мы хранили часть данных в системе планирования SAP ERP, другую часть — в компоненте для управления запасами EWM и на нашем сайте. Это значит, чтобы отобразить интервал доставки при оформлении заказа, нужно получить данные о доступности ресурсов из трёх разных систем. То же самое с любыми доработками, в том числе с простыми изменениями логики доставки для курьеров.

Отслеживать сбои в монолите тоже было непросто. Из-за запутанной, где-то сращённой логики невозможно было разобраться, чей набор функций работал некорректно. Например, адрес доставки каким-то неявным способом влияет на скидки. Кто должен это исправить? Продуктовые команды перекладывают ответственность друг на друга: «это не наше, идите к логистике». Поэтому на устранение проблемы уходило слишком много времени.

Также из-за сложности кода, его нечитабельности было трудно привлекать новых разработчиков: чтобы разобраться со старым, нагруженным решением, требовалось время.

За два года мы переработали весь ландшафт приложения

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

Мы не могли остановить бизнес-процессы, переделывать приходилось на ходу.

Это всё равно что пересобрать двигатель, пока автомобиль мчится по дороге на скорости 220 км/час. Звучит невыполнимо. Но в итоге за два года мы переделали 80% приложения.

  • Начали с изменений в архитектуре. Раньше в приложении «Утконоса» была только витрина и SAP-платформа. Корпоративной шины, которая бы связывала продукты внутри системы, не было. Мы её создали.
  • Потом взялись за микросервисы. Где-то использовали отторгаемую бизнес-логику и реализовывали её по-новому, а где-то просто переносили модуль на более подходящий стек. Первым независимым элементом стала TMS (система управления транспортом).
  • Долго анализировали и разделяли базу данных. Изменили отдельные её части, подвязали их к разным микросервисам.
  • Исправили исходный код. Создали из кусочно-лоскутной архитектуры красивое, понятное решение.

Из незавершённого — это бэкэнд-витрина. Эта часть до сих пор в процессе рефакторинга. Мы могли бы её оставить в прежнем виде (она выдерживает нагрузку), но решили всё же разбить на микросервисы: мы собираемся кратно расширить команду, чтобы запараллелить процессы. На монолите это было невозможно, а на микросервисах достижимо.

Нам помогла пандемия

В тот период всем нужно было меняться быстрее обычного. Нам удалось запустить экспресс-доставку за 2 часа (до этого привозили только на следующий день), расширить ассортимент на десятки тысяч товаров (сейчас в ассортименте 70 тысяч позиций, это сопоставимо с ассортиментом огромного гипермаркета) и создать самописную WMS-систему (warehouse management system), которая автоматизирует работу складов. Последнее обычно занимает полтора-два года, но мы справились за 9 месяцев, над этим проектом сегодня трудятся 70 специалистов: продакты, разработчики, аналитики и тестировщики.

Нагрузку увеличивали постепенно. Сначала рядовая проверка на тестовых стендах, потом интеграционная, потом — выкладка в продуктив на минимальный трафик 1–5% и плавное увеличение до 100%. Некоторые сервисы мы просто «зеркалировали»: процессы работали по старой логике, пока мы тестировали новую.

Численность ИТ-департамента выросла в два раза

При переходе от монолита к микросервисам мы не привлекали сторонних специалистов, обращались к ним только за консультацией (иногда важно услышать другую точку зрения). Поэтому команду расширили — в три раза (причём через профильные сайты нашли всего половину, остальных — по рекомендациям и через соцсети, в том числе LinkedIn). Разработчиков стало больше, около 80%, тестировщиков — порядка 20%.

При этом обновление технологического стека и переход на Python сильно упростили наём: молодые специалисты теперь охотнее идут к нам в команду.

Сейчас в ИТ-команде «Утконоса» более 400 человек, в начале года нас было 219.

Инициативы бизнеса стали реализовываться мгновенно

До перехода мы вели работу в разных вариациях системы SAP. Система — всё ещё часть компании, но большая её часть превратилась в микросервисы и разделилась на 3 основные части:

  • Витрина, которая состоит из сайта, приложений для iOS и Android. Именно с ней взаимодействуют наши клиенты.
  • Warehouse Management System — система управления нашими складами, сейчас их 4. WMS координирует сотрудников и процессы. Например, механизирует приёмку и размещение товара, комплектацию и отгрузку заказов, обработку возвратов и инвентаризацию.
  • Transport Management System — система управления грузоперевозками, она оцифровывает заказ и размещает его в существующих маршрутах.

Раньше, если что-то не получалось, мы часто слышали: «виноват ИТ-департамент». Теперь этот тезис благополучно забыт. С переходом на микросервисы мы моментально подхватываем практически любую инициативу бизнеса.

Например, весной 2021 года у компании возникла идея продавать букеты и доставлять их день в день. Мы собрали необходимые функции максимально быстро (от идеи до внедрения прошло два месяца) и реализовали такой алгоритм, который позволил привозить свежие цветы от поставщика сразу к клиенту — то есть с виртуальной приёмкой, без отгрузки на нашем складе.

У каждого набора функций от бизнеса свой продакт-менеджер: он оценивает инициативы бизнеса с точки зрения юнит-экономики (сколько денег принесёт та или иная доработка), отклоняет неактуальные, ставит задачи по наиболее важным изменениям.

Советы коллегам

«Распил» монолита — это долго, сложно и травматично. Именно поэтому так много компаний продолжают использовать устаревший легаси-код. Если ваша компания всё же решилась на трансформацию, наш главный совет:

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

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

0
24 комментария
Написать комментарий...
Igor Karbachinsky

Спасибо за рассказ.
«Из-за запутанной, где-то сращённой логики невозможно было разобраться, чей набор функций работал некорректно» — а как микросервисы помогли решить эту проблему?

Ответить
Развернуть ветку
Ivan Pogoreloff

Замените облако микросервисами :-)

Ответить
Развернуть ветку
Лента Онлайн и Утконос
Автор

Добрый день!
Микросервисная архитектура сделала систему прозрачной и ускорила решение инцидентов. У нас есть четкое понимание какая команда за что отвечает. Если у какой-то системы неполадки — чинить нужно только этот «кусочек», а не искать причину по всей системе.

Ответить
Развернуть ветку
Mario Kun

Хотелось бы больше технических подробностей )

Ответить
Развернуть ветку
Лента Онлайн и Утконос
Автор

Добрый день!
В будущих статьях обязательно уделим больше внимания техническим подробностям :)

Ответить
Развернуть ветку
kav

Вообще интересно как находясь на рынке доставка продуктов десятки лет утконос умудрился в чистую слить рынок таким компаниям как лавка и самокат

Ответить
Развернуть ветку
Аккаунт удален

Комментарий недоступен

Ответить
Развернуть ветку
Andrey Smalkov

А как Apple всех уделал с умными часами ? Сейчас ещё и с процессорами ) Первый не всегда лучший. Тогда не было такого чудесного чёрного лебедя, который сместил бы весь спрос в онлайн.

Ну и надо учесть, что продукты у Утконоса интересные, не совсем тот классический масс-Маркет, который есть в остальных магазинах. Т.е. у них есть определенная доля рынка и лояльные покупатели, но у них нет таких инвестиций, которые могут себе позволить Яндекс, Сбер и Мейл

Ответить
Развернуть ветку
kav

Так в утконос вложили больше денег чем в ту же яндекс лавку

Ответить
Развернуть ветку
Andrey Smalkov

Откуда вы взяли эту информацию ? Покажите детали где они в моменте роста вложили больше денег

Ответить
Развернуть ветку
kav

Открытых данных к сожалению не могу найти, но даже стоимость 1го распределительного центра (5 млрд рублей) уже больше чем все инвестиции в лавку

https://www.retail.ru/news/utkonos-otkryl-raspredelitelnyy-tsentr-v-podmoskove/

Ответить
Развернуть ветку
Илья Басалаев

Хоть бы кто уже признал, что микросервисы - это не для скорости и надёжности, а просто потому, что не получается найти достаточное количество грамотных разработчиков на одной платформе и приходится скрещивать ужа с ежом: тут пять человек пишут на Go, там десяток на PHP, здесь ещё несколько на Котлине и так далее.
Что, скорость? Вы всерьёз считаете, что взаимодействие по сети, через шину, со всеми задержками tcp-стека будет быстрее обмена данными внутри одного процесса?
Надёжность? Падение любого из сервисов точно так же ломает работу системы, только теперь надо ещё отслеживать работоспособность шины, доступность сети и всех обвязок типа кубернетеса.

Простота? Да куда там, если теперь сервис теперь должен ещё реализовывать логику «а что делать, если обмен не прошел», саги и прочее.

400 человек на один проект? Кровь из глаз. Времена, когда мы всемером написали полноценный интернет-банк (включая обвязки со стороны банковской системы и других внешних компонент) предстают уже просто сказочной эпохой какой-то.
Управление интернет-магазином сложнее банка? Не уверен, но предположим. Но уж точно не в 50 раз.

Ответить
Развернуть ветку
p0st

Всё циклично, сначала пилим, потом клеим, потом снова пилим.
В процессе узнаём много нового и изобретаем интересное, а там раз и пенсия не за горизонтом))

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

Ответить
Развернуть ветку
Ska Moscow
Ответить
Развернуть ветку
Andrey Smalkov

Помнится не так давно из-за вашей микросервисности вас обобрали на десяток миллионов из-за уязвимости в системе скидок ) и потом вы ещё пару недель закрывали эти уязвимости. Зато модно и по хипстерски 🙂

Но на самом деле желаю вам успехов. Учиться на ошибках и становиться только сильнее.

Ответить
Развернуть ветку
Дмитрий Жучков

Очень бы хотелось узнать какой стек технологий где используете :)

Ответить
Развернуть ветку
Лента Онлайн и Утконос
Автор

Дмитрий, добрый день!

Витрина использует php, go, angular, kotlin, swift, MySQL, PostgreSQL, Docker, Kubernetes.
Микросервисы используют React, Java, PostgreSQL, Python.

Ответить
Развернуть ветку
Дмитрий Жучков

А почему в микросервисах не используете go?

Ответить
Развернуть ветку
Лента Онлайн и Утконос
Автор

Прошу прощения - опечатка :) В микросервисах тоже используем go

Ответить
Развернуть ветку
Andrey Sakharov

Прикольно, вы ещё и с ангуляра на реакт мигрировали)

Ответить
Развернуть ветку
Lisette

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

Ответить
Развернуть ветку
Лента Онлайн и Утконос
Автор

Добрый день!
В пиковые дни марта на сайт поступало 3000 запросов в секунду, почти 11 млн в час. Мобильное приложение и сайт выдерживали нагрузку и работали относительно стабильно. Что касается back-систем, то проблем из-за повышенной нагрузки практически не было. Логистическое ПО, складские системы и весь софт операционной части бизнеса функционировали бесперебойно.
Количество слотов для доставки было ограничено нашими складскими ресурсами :( Мы не принимали заказов больше , чем могли обслужить с сохранением уровня сервиса и качества обслуживания.

Ответить
Развернуть ветку
Дмитрий Козлов

не поверю даже в один миллион заказов в день

Ответить
Развернуть ветку
Дмитрий Козлов

"Монолитом называют продукт, все компоненты которого взаимосвязаны и взаимозависимы. Если один не работает, то не работают и все остальные"
А микросервисы типа если не работают то всё в порядке.

Совсем неправильное определение.
Автор не умеет готовить монолит

Ответить
Развернуть ветку
21 комментарий
Раскрывать всегда