Девять минут вместо шестнадцати часов
Обработка ключевых процессов перестала занимать рабочие сутки. Результат стал доступен в тот же час, когда пришли данные, а не на следующий день.
16+ ч → 9 мин
Логистика · микросервисы
Было: ключевые логистические операции проходили обработку больше шестнадцати часов, и результат зависел от того, успел ли человек довести цепочку до конца. Сделали: разложили процесс на этапы и закрыли каждый отдельным сервисом на Go за централизованным API-шлюзом, а операторам дали рабочую панель на Nuxt 3 с табличным вводом. Стало: девять минут на ту же обработку и восемь сервисов, каждый из которых масштабируется отдельно.
Контекст и задача
Обработка ключевых операций занимала больше шестнадцати часов. Это не только долго — это ещё и непредсказуемо: пока цепочка идёт, никто не может сказать, на каком она шаге.
Такие процессы почти всегда устроены одинаково: несколько разнородных этапов, между которыми данные переносятся руками или полуручными выгрузками. Каждый этап по отдельности выглядит небольшим, но общее время складывается не из работы, а из ожидания — когда освободится человек, когда придёт файл, когда кто-то заметит, что предыдущий шаг не доехал.
Отдельная сложность — интерфейс. Операторы работают с данными в табличном виде и сравнивают их построчно; форма с полями по одному значению для такой работы бесполезна, а выгрузка в Excel возвращает нас к тому, с чего начали: данные снова живут вне системы.
Третье ограничение — корпоративный контур. Учётные записи уже есть в LDAP, заводить второй список пользователей никто не будет, а доступ к сервисам должен проверяться в одном месте, а не в восьми.
Задача формулировалась так:
Решение
Микросервисы здесь не самоцель, а способ дать каждому этапу собственный темп изменений и собственное масштабирование.
ADR · почему микросервисы, а не один процесс
Контекст. Этапы обработки с разным профилем нагрузки и разным темпом изменений; узкое место — один из них, а не все сразу. Решение. Восемь сервисов за централизованным шлюзом, аутентификация и маршрутизация вынесены на вход. Следствие. Масштабируется тот сервис, которому тяжело. Цена — распределённая система, поэтому централизованные логи и единая точка авторизации не «когда-нибудь потом», а часть первой поставки.
Архитектура
Панель и внешние клиенты видят один шлюз. За ним — восемь сервисов на Go, общий MS SQL Server и отдельный контур наблюдаемости: логи собираются Vector и уходят в Elasticsearch.
Результат
Главный эффект — не в скорости отдельного шага, а в том, что из процесса ушло ожидание.
Обработка ключевых процессов перестала занимать рабочие сутки. Результат стал доступен в тот же час, когда пришли данные, а не на следующий день.
16+ ч → 9 мин
Нагрузка редко распределяется равномерно. Отдельные процессы позволяют добавить мощности там, где узко, не выкатывая заново всю систему.
8 микросервисов на Go
Учётные записи остались в LDAP, доступ проверяется на шлюзе и подтверждается JWT. Внутренняя топология не протекает наружу и меняется без согласований с клиентами.
Шлюз · LDAP + JWT · Nginx
Логи всех сервисов собираются в одно место, поэтому разбор инцидента начинается с поиска по журналу, а не с обхода восьми контейнеров.
Vector → Elasticsearch
Роль maincode
В проекте важно различать инженерную часть и предметную: вторая всегда остаётся на стороне заказчика.
Что применили
Услуга
Обмен данными между системами без ручных выгрузок: гарантия доставки, идемпотентность, журнал обмена.
Услуга
Сервисы и микросервисы с понятными границами, шлюзом, аутентификацией и предсказуемым поведением под нагрузкой.
Услуга
Схемы, индексы, версионированные миграции и оптимизация запросов в MS SQL Server и PostgreSQL.
Если ваша задача другая — посмотрите разбор мультиарендной ERP или движок распределения товара. Полный список — на странице проектов.
Похожая задача?
Смотрим на этапы, ручные переносы данных и точки, в которых процесс останавливается. Возвращаемся с границами сервисов и планом реализации. maincode — инженерная студия ИП Диденко М. С.