16 апреля 2026 1
Любая система рано или поздно проверяется на прочность: нагрузкой, ростом бизнеса или человеческим фактором. Именно в эти моменты всплывают решения, которые казались безобидными на старте. Ниже — реальные кейсы из практики, где небольшие архитектурные допущения со временем превращались в ощутимые проблемы. Разберем, какие сигналы можно было заметить сразу и что стоит учитывать, чтобы не повторить эти сценарии в своих проектах.
Бабушка с долгом в полмиллиона, однопоточное ядро и другие грабли: как не повторить чужие архитектурные ошибки

Конкурентная запись и случай с бабушкой


Проект — автоматизация работы коллекторского агентства. Классический корпоративный Oracle-стек: монолит на Oracle ADF, WebLogic, Oracle Database. Бизнес-логика «размазана» между Java и PL/SQL, как это часто бывает, когда в команде есть сильные PL/SQL-разработчики и «немножко Java».

Один из таких разработчиков использовал сессионные переменные в PL/SQL-пакете. Выглядело это невинно: глобальная переменная, инкремент, геттер.

Пример кода:

CREATE OR REPLACE PACKAGE unsafe_counter AS
g_count NUMBER := 0;

PROCEDURE increment;
FUNCTION get_count RETURN NUMBER;
END unsafe_counter;
CREATE OR REPLACE PACKAGE BODY unsafe_counter AS
PROCEDURE increment IS
BEGIN
g_count := g_count + 1;
END;
….

Код работал, QA прогнал сценарии, бизнес-пользователи довольны. Как говорится, ничто не предвещало беды, пока однажды сотрудники агентства не приехали в деревню к бабушке с требованием вернуть долг в 500 000 рублей. Реальный долг был около 5 000. Бабушке стало плохо, вызвали скорую. Дальше — расследование.

Корень зла оказался банальным. Пользовательские сессии в приложении и сессии в базе данных — это не одно и то же. Несколько пользовательских сессий попали в один connection pool, а значит, — в одну сессию Oracle. Сессионные переменные перетерлись. Два параллельных бизнес-процесса начали влиять друг на друга.

1.png

Такой баг не ловится happy path’ом. Он не ловится обычным регрессионным тестированием, сценарий которого редко учитывает одновременную работу двух сотрудников над одним и тем же бизнес-процессом. И он почти не ловится нагрузочными тестами, потому что они проверяют пропускную способность, а не качество данных.

Мы приняли волевое решение и полностью вынесли бизнес-логику из PL/SQL в Java. В базе данных остались только таблицы. Вышло дорого, долго и больно, но после этого класс ошибок исчез целиком.

Главный вывод — код-ревью нужно было проводить внимательнее, хотя от подобных проблем на проекте сложно застраховаться полностью.

Немасштабируемое «ядро» в монолите, или Как один поток положил всех

Другой проект — крупный ритейл, около 2 500 точек продаж по стране. Интеграция всего со всем: старые системы, 1С, SAP ERP. В центре — Oracle SOA Suite, ESB, WebLogic, Oracle Database. Задачей проекта было объединить данные со всех точек продаж. Одними только интеграционными потоками занимались более 20 разработчиков.

На схеме все выглядело почти микросервисно: открываем консоль управления Oracle SOA Suite и видим сотни небольших композитов, которые как будто бы работают независимо. Очереди, адаптеры входных и выходных каналов, асинхронные потоки, Java Message Service (JMS) — красота. Но под капотом это был монолит, развернутый на одной виртуальной машине Java. И в самом центре — ядро в WebLogic-сервере, которое забирало сообщения из очередей, ходило в базу данных за маршрутизацией и раскладывало сообщения дальше. Таким образом, например, Лист продаж должен был поступить в соответствующем формате и в SAP ERP, и в 1С, и в хранилище данных, а ядро маршрутизировать это сообщение на три очереди, из которых его заберут адаптеры выходных каналов.

2.png

Именно немасштабируемое ядро оказалось узким местом. Когда один источник начинал лить 100 000 сообщений, система не справлялась с нагрузкой.

Мы перепробовали все что можно: выделенные потоки WebLogic Server Work Manager, JMS-очереди с приоритетами, вертикальное масштабирование. Дошли до жирной физической машины на 64 ядра и 256 ГБ памяти. На этой машине мы смогли запуститься и продержаться несколько месяцев.

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

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

А бонусом мы получили еще один урок: disaster recovery нужно тестировать заранее. Та самая мощная физическая машина стала идеальной мишенью для майнингового червя. 31 декабря он запустился и начал майнить криптовалюту. Вся шина встала, но заметили это лишь по окончании январских праздников. Пришлось срочно перезапускаться на резервной машине. И все бы ничего, да только на ней заработало только 70% интеграционных потоков. Почему не заработали оставшиеся 30%? Потому что доступы, сетевые адреса, открытие портов и адресов заказывали разные проджекты и аналитики, которые добавляли новые интеграционные потоки. Кто-то из них вспомнил про существование резервной машины, а кто-то нет.

Почему нужно дружить с командой поддержки

Проект — международный банк, 3 000 корпоративных приложений, инвестиционный домен. Современная микросервисная архитектура: Spring Boot, Kubernetes, Sybase Database, gRPC, отдельные сервисы start-of-day и intraday. Информация из базы данных, в которой работают трейдеры, валидируется, упаковывается и отправляется по gRPC в сервис обогащения. Сервис обогащения идет во внешние системы и проверяет сделки с другими участниками рынка. Находит им пары, обогащает информацией и возвращает ответ, который складируется в базе данных подготовки отчетов. Оттуда сервис агрегации схлопывает все движения по конкретной ценной бумаге и в виде агрегированной выгрузки в формате CSV по старинке отправляет во внешнее корпоративное хранилище данных, откуда уже формируется отчетность регулятору.
3.png


Эта архитектура была спроектирована предыдущей командой, мы ее подхватили, реализовали и довели до ума. Все заработало.

На этапе передачи в эксплуатацию руководитель службы поддержки сказал: «Вы, конечно, молодцы, что сделали современное микросервисное решение, но у нас нет вашего сервиса управления расписаниями. У нас есть Control-M, общая система ведения всех скриптов и процессов. Переделывайте». И тут стало понятно, что никто не обсуждал с ними архитектуру на старте. Для инженеров поддержки важно не то, что «красиво и современно», а то, что у них есть единая панель управления. Наш сервис выбивался из их операционной модели.

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

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

Проприетарная «сверхмасштабируемая» система заказчика и однопоточный ад

Самый свежий и самый дорогой кейс. Платформа анализа данных в реальном времени для важного участника российского товарного рынка. Современный стек: Spring Boot, PostgreSQL, ClickHouse, OpenSearch, Infinispan, RabbitMQ, WebSocket.

Заказчик настоял на использовании своей проприетарной системы распределения изменений SystemX по WebSocket.

Архитектура выглядит примерно так:

4.png

Внешние системы отправляют сырые рыночные данные. Сервисы вида Feed Handler их обрабатывают, преобразуют в понятный нам JSON и отправляют в RabbitMQ, откуда он дальше маршрутизируется по множеству обработчиков. Каждый из этих обработчиков — это отдельный микросервис, который сохраняет данные в своей базе данных. Это такой CQRS-стиль, когда в разных базах данных хранятся разные проекции под разные нужды. Одна из которых — доставка данных в режиме реального времени через SystemX по протоколу WebSocket. Данные пишутся в SystemX через кастомный проприетарный коннектор. SystemX содержит подписки всех пользователей и через сервис на Java отправляет информацию об изменении данных, например повышении цены, по одному из инструментов. Эта изменившаяся цена приходит в микросервис, который держит подписки, а он, в свою очередь, отправляет ее всем пользователям, которые подписались на этот конкретный инструмент.

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

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

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

Финальное решение оказалось гибридным. Мы сохранили RabbitMQ, добавили маршрутизацию загрузки на обработчики по хешу инструмента, сделали хранение истории за день в Infinispan, обеспечили порядок внутри одного инструмента и параллелизм между разными. По сути, реализовали Kafka-подобную модель поверх имеющегося стека. Архитектура в целом осталась прежней:
5.png
6.png
На реализацию ушло еще полгода. Мой вывод: закрытый вендорский продукт — не очень хорошая основа архитектуры. «Коробку» имеет смысл ставить только на базовые поддерживающие функции вроде расчета зарплаты. Для всего остального есть Mastercard собственная разработка на базе open source.

Что я вынес из всех этих историй

1. Клиент всегда прав, но нужно уметь ему возразить аргументированно и вовремя.
2. Несформулированные требования не означают их отсутствия. Некоторые вещи — например, по части производительности — кажутся заказчику очевидными.
3. Архитектура почти никогда не ломается в happy path’е. Она ломается в параллельности, в масштабировании и на стыке команд. Важно избегать узких мест by design.
4. Ревью кода и архитектуры — это must.
5. Многопоточность появляется всегда, даже если мы о ней не подумали. Нагрузочные тесты очень важны.
6. Архитектура не живет в вакууме. Помимо разработчиков, есть поддержка, информационная безопасность и бизнес-пользователи. Игнорировать любую из этих сторон — значит закладывать будущий инцидент.
7. Ошибки будут всегда. Вопрос только в том, извлечем ли мы из них выводы или повторим их на следующем проекте.

И еще одна вещь, которую сложно принять в начале карьеры: без таких историй не вырасти. Невозможно стать техдиром или сильным архитектором, ни разу не ошибившись в продакшене. Узкие места начинаешь видеть только после того, как однажды сам их не увидел. Так что как бы вы ни старались не наступать на грабли, все только на себе — и никак иначе.
Оригинал статьи на хабре.

Последние статьи в блоге

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

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

Новости
16 апреля 2026

Как защитить информацию в приложениях, использующих ИИ

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

Новости
08 апреля 2026

Java без розовых очков: какие знания отделяют грейды

Почти каждый разработчик рано или поздно задается вопросом: «Я уже Middle или все еще уверенный Junior?» Опыт растет, задач становится больше, стек шире — но вместе с этим появляется и иллюзия, что раз ты пишешь на Java каждый день, значит, язык знаешь.

Новости
23 марта 2026

ИИ против джуна: как победить нейросети при устройстве на работу

Начинающим разработчикам и раньше было непросто найти первую работу, а сейчас и подавно: конкуренция выросла кратно, а рынок окончательно стал «рынком работодателя».

11 марта 2026

Мартовский апгрейд: обновляем компетенции со скидкой 20% и приятными бонусами

Март — традиционное время не только для обновления природы, но и для профессионального роста. С 1 по 31 марта 2026 года у нас действует акция «Мартовский апгрейд».

05 марта 2026

Февраль 2026: Разбираем тренды, прокачиваем архитектуру и учимся договариваться с ИИ. Бесплатные вебинары для ИТ-специалистов

Февраль — месяц, когда уже видны цели на год, но еще есть время скорректировать курс и зарядиться новыми знаниями.

Новости
06 февраля 2026

Как ИТ-компании могут компенсировать до 10 млн ₽ на обучении сотрудников в 2026 году

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

Жизнь компании
20 января 2026

Архитекторы vs Рутина: Как открытый вебинар за 2 недели превратился в кастомный ИИ-интенсив

В Учебном центре IBS мы регулярно проводим бесплатные вебинары для ИТ-специалистов. Это наша философия — делиться реальными знаниями, а не просто давать рекламу. Один из таких вебинаров, посвященный практическому применению ИИ в инженерии, посетили сотрудники крупной компании — лидера в спортивном ритейле.

12 января 2026

Чистая выдумка: Как придумать класс, которого нет, и спасти проект от хаоса

Знакомо: вы описываете требования, рисуете сущности — Клиент, Заявка, Документ… А потом система превращается в «комок» с сильной связанностью (big ball of mud), где любое изменение стоит как полпроекта?

Новости
16 декабря 2025

Федеральное признание: нашу программу по системному анализу признали лучшей ИТ-программой в стране

Программа Учебного центра IBS «Системный аналитик. Уровень Специалист» признана лучшей ИТ-программой онлайн-обучения в России по итогам премии «СМАРТ ПИРАМИДА — 2025»!

16 декабря 2025

Бизнес-аналитик 2.0: как меняется профессия и какие навыки теперь нужны

Когда-то бизнес-аналитик ассоциировался с человеком, который «пишет ТЗ». Сегодня этого явно недостаточно. Современный БА — это стратег, коммуникатор и системный мыслитель, который одинаково уверенно чувствует себя в бизнес-контексте и технических деталях. Чтобы не застрять в прошлом, важно понимать, как эволюционирует роль аналитика и какие компетенции становятся критически важными.

Новости
05 декабря 2025

Обратная сторона Event-Driven: Почему Мартин Фаулер призывает к осторожности?

Вы узнаете один из 4 ключевых паттернов EDA и поймете, как избежать главной ловушки, в которую попадают многие команды.

Новости
25 ноября 2025

Скидка 30% на 8 курсов декабря

Год близится к завершению, и пока другие подводят итоги, вы можете сделать самую выгодную инвестицию — в себя. Мы собрали 8 курсов со скидкой 30%*, которые стартуют в начале декабря, чтобы вы могли точно успеть пройти обучение до конца года и прийти к новым карьерным целям с обновлённым стеком технологий.

Новости
20 ноября 2025

Осенний апдейт карьеры: от -30% до -50% на курсы ноября!

Только сейчас: скидки от 30% до 50%* на ноябрьские курсы для тех, кто хочет быть на шаг впереди в IT. Практические программы помогут укрепить ключевые навыки и выйти на новый уровень профессиональной зрелости. Успейте подать заявку, чтобы воспользоваться предложением.

Новости
23 октября 2025

Как одновременно заварить кофе для 10 000 сотрудников — и еще 7 неожиданных вопросов архитектору ПО

Как убедить заказчика отказаться от Excel, зачем архитектору опыт кодинга и почему эволюция ПО похожа на эволюцию живых существ?

Новости
21 октября 2025

Как живые вебинары повышают эффективность ИТ-обучения

ИТ-рынок сегодня меняется стремительнее, чем когда-либо: появляются новые технологии, фреймворки и подходы.

Новости
06 октября 2025

ИИ в разработке ПО: преимущество или риск

Инструменты на базе искусственного интеллекта все чаще используются при создании программного обеспечения. Рассмотрим, какие задачи помогает решать ИИ и какие опасности несет

Новости
24 сентября 2025

Чему нас учит ИИ: как стать идеальным сотрудником

Сейчас чаще говорят об этике использования ИИ — как не получить плагиат или не доверить слишком много, но при этом редко задумываются о другой стороне медали: этична ли наша работа?

Новости
12 сентября 2025

Как ИИ действительно влияет на продуктивность разработчика: неожиданные выводы из исследований

За последние пару лет у многих разработчиков в редакторах и IDE поселились новые «напарники» — всевозможные ИИ-инструменты. Обещания были впечатляющие: меньше рутины, быстрее релизы, код пишется почти сам. Но когда первые восторги улеглись и появились системные исследования, стало ясно: эффект от ИИ далеко не такой однозначный. Где-то он действительно ускоряет работу команд на 20%, а где-то, наоборот, тормозит опытных инженеров. И вот парадокс: даже там, где выигрыш в скорости очевиден, бизнес не всегда чувствует, что проекты двигаются быстрее.

Новости
08 сентября 2025

Сквозная логика: от бизнес-процесса к реализации без потерь

Главный принцип работы с проектной документацией — поддерживать её связность и актуальность. Любая, даже самая детальная схема (BPMN, Use Case, C4), мгновенно теряет ценность, если она конфликтует с другой. Узнаёте? Сначала все силы бросают на «личный кабинет», но после пары спринтов главным внезапно становятся «возвраты». В результате возникает опасный разрыв: цели проекта, реализуемый функционал и схемы, которые должны их описывать, живут своей жизнью. Документация превращается в «мёртвые зоны», которые больше не отражают реальность.

29 августа 2025

Нужна помощь? Оставьте заявку, и мы свяжемся с вами в ближайшее время

Согласен получать на e-mail информационные рассылки о новостях компании Учебный центр IBS
Корпоративное обучение Оценка персонала Сертификация О нас Стать тренером Блог Личный кабинет
Пользователь только что записался на курс ""
Спасибо!
Форма отправлена успешно.