Как мы разделили розницу и опт — простым языком
Когда бизнес вырос, розничные и оптовые продажи начали «мешать» друг другу в одной базе: разные документы, разные процессы, сложная статистика. В итоге приняли решение — разделить всё на две базы МойСклад:
- одна — для розницы
- вторая — для опта
Но при этом товары (SKU) должны оставаться синхронизированными, а документы — автоматически передаваться между базами.
Инфраструктуру построили в Yandex Cloud на serverless-стеке — чтобы было дешево, масштабируемо и без обслуживания серверов.
Основная идея
Всё работает по принципу:
Событие → Очередь → Обработчик → Вторая база
И в обратную сторону — точно так же.
Как это работает
В розничной базе меняется статус заказа
Например, заказ получил статус «Передать в опт».
МойСклад отправляет вебхук — это просто уведомление:
«Произошло событие, вот ID документа»
Вебхук приходит в API Gateway
Запрос попадает в облачный gateway (в Yandex Cloud). Мы не обрабатываем заказ сразу — таймаут работы вебхука в МойСклад 1500ms.
Мы делаем проще:
- принимаем событие
- кладём его в очередь
- сразу отвечаем «Ок»
Сообщение попадает в очередь
Очередь нужна для надёжности:
- если функция упадёт — сообщение не потеряется
- если событий много — они будут обрабатываться по порядку
- если нагрузка вырастет — система масштабируется автоматически
Очередь — это буфер между «событием» и «обработкой».
Функция обрабатывает сообщения из очереди
Когда в очереди появляется сообщение, триггер запускает serverless-функцию.
Она:
- Берёт ID заказа
- Запрашивает полный заказ из розничной базы
- Для каждого товара ищет соответствие в оптовой базе
У нас для этого используется поле syncID:
- в новой базе у товара хранится ID из старой базы
- это позволяет быстро понять, какой товар соответствует какому
После сопоставления:
- создаётся заказ в оптовой базе
- сохраняется связь между документами
Готово.
Обратное направление (опт → розница)
Когда в оптовой базе:
- заказ собран
- создана отгрузка
срабатывает тот же алгоритм:
- Вебхук
- Gateway
- Очередь
- Функция
- Создание приёмки в розничной базе
Архитектура зеркальная.
Почему мы сделали именно так
Надёжность
Очередь гарантирует, что событие не потеряется.
Масштабируемость
Serverless автоматически обрабатывает пики нагрузки.
Простота
Нет серверов, нет сложной инфраструктуры.
Контроль
Все соответствия товаров и документов хранятся в базе (YDB).
Можно всегда понять:
- какой заказ куда ушёл
- какой товар чему соответствует
Что это дало бизнесу
- Розница и опт больше не мешают друг другу
- Статистика стала прозрачной
- Документы автоматически передаются
- Ручной работы стало меньше
- Ошибки из-за человеческого фактора сократились