Системный анализ | Ольга Пономарева
32K subscribers
3.35K photos
60 videos
22 files
1.25K links
https://t.me/care_sa
Ольга Пономарева, старший системный аналитик с опытом более 8 лет

Выпустила более 2000 учеников, которые увеличили свой доход и прокачали скиллы

Найдите обучение для себя в школе Систем Аналист: https://systemanalyst.life
Download Telegram
Правильный ответ: Идемпотентная обработка по бизнес-ключу payment_id: повторное событие не меняет баланс второй раз


📖 Пояснение:

At-least-once означает: сообщение дойдёт, но возможен дубликат (сбой после обработки, но до commit offset).

Решение на уровне бизнес-логики — идемпотентность:
▫️ Хранить обработанные
payment_id в таблице processed_events
▫️ Или upsert с тем же ключом — повторный вызов даёт тот же результат
▫️ Это стандартное требование аналитика в ТЗ на интеграции через брокер


Почему не 2

Exactly-once в распределённой системе — сложная комбинация (транзакции Kafka + идемпотентный producer + координация с БД). «Брокер сам всё решит без дедупликации» — миф. Даже EOS в Kafka не отменяет идемпотентность на стороне consumer для внешних side effects (бонусы, деньги).


Почему не 3

Sync REST не убирает дубликаты — клиент может повторить запрос при таймауте. Проблема идемпотентности остаётся, плюс появляется coupling и каскадные таймауты по цепочке сервисов.


Почему не 4

Отключение ack усугубляет потери и хаос: при сбое offset не фиксируется, но отказ от ack не равно "не будет retry". На практике — риск потерять сообщения или обрабатывать бесконечно. Это антипаттерн.


💡 На Middle-собесе ждут связку: at-least-once → дубликаты возможны → idempotency key в ТЗ.
🔥92
Правильный ответ: BFF-слой с параллельной агрегацией данных или выделенный composite endpoint, собирающий ответ за один round-trip


📖 Пояснение:

Проблема — синхронная цепочка (latency суммируется: 5 × ~800 мс ≈ 4 с). Gateway как "тупой прокси" не обязан агрегировать — но кто-то должен.

Варианты в ТЗ:
▫️ BFF (Backend for Frontend) — сервис под мобилку, параллельно дергает 5 API (Promise.all / async), отдаёт один DTO экрана
▫️ Composite endpoint в доменном сервисе — GET /orders/{id}/screen внутри собирает данные
▫️ Параллель, а не последовательность — p95 падает до max(вызовов), а не sum(вызовов)


Почему не 2

Увеличение таймаута — костыль. Пользователь ждёт 4+ секунды на каждом экране — плохой UX и отток. НФТ по latency нужно решать архитектурой, не настройкой клиента.


Почему не 3

Перенос бизнес-логики в Gateway — антипаттерн "умный gateway". Раздувается компонент, смешиваются cross-cutting и domain logic, усложняется тестирование и релизы. Gateway = фасад, BFF = агрегация под клиента.


Почему не 4

Прямые вызовы с телефона в 5 микросервисов — хуже: больше round-trip'ов с мобильной сети, нет единой точки auth/rate limit, внутренняя топология светится наружу, CORS и безопасность усложняются.


💡 На собесе: "Gateway ≠ BFF. Для тяжёлых экранов — отдельный BFF с параллельной агрегацией".
🔥114
Правильный ответ: При разрыве работа с остатками только при большинстве реплик. Если кворума нет — ошибка


📖 Пояснение:

Бизнес-правило из вопроса: перепродажи недопустимы → важнее согласованность, чем доступность любой ценой.

При network partition:
▫️ CP: система откажет в записи/чтению, если нет большинства реплик (quorum) — клиент получит 503/409, но двойная продажа одной единицы не произойдёт
▫️ Это ближе к strong consistency / linearizability на критичном ресурсе

Примеры подходов: etcd/ZooKeeper consensus, БД с sync replication и правилом "не пишем без кворума".


Почему не 2

Классический анти паттерн: оба узла принимают заказ → две продажи одной штуки — как раз то, от чего бизнес отказался. Согласованность для остатков склада без компенсации = финансовые потери.


Почему не 3

Один DC без репликации не решает отказоустойчивость. Partition tolerance в облаке неизбежна. Это шаг назад по availability при аварии ЦОД, а не осознанный CAP-выбор.


Почему не 4

Клиентский кэш остатка — ещё слабее по консистентной работе: пользователь видит фантомный товар. Не заменяет серверную модель согласованности и не предотвращает race condition на двух репликах.


💡 CAP на практике: не зубрить буквы, а привязать к НФТ — "перепродажа vs 503" → CP на остатках.
🔥93💯1
Последние пару недель мы начали экспериментировать с форматом контента.

Если раньше чаще были карточки с теоретической информацией, то сейчас стали добавлять больше настоящих рабочих кейсов аналитиков.

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

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

Интересно понять, как вы это ощущаете 🙂
🔥114
🎙 Вышел новый выпуск подкаста «Аналитик за кулисами»

Тема выпуска — архитектура систем

Про то, как на самом деле рождаются IT-системы: от бизнес-идеи и Vision до требований, архитектурных решений, MVP и пилота

В гостях — Кирилл Егоркин, архитектор решений

В выпуске обсудили:

— зачем проекту Vision и кто его формирует;
— где заканчивается зона ответственности аналитика и начинается зона архитектора;
— какие артефакты нужны до разработки;
— почему бизнес часто приходит не с проблемой, а с уже готовым решением;
— когда выбирать монолит, а когда микросервисы;
— как системному аналитику начать мыслить архитектурно


Этот выпуск особенно хорошо зайдёт тем, кто хочет лучше понимать, почему системы проектируются именно так, а не просто запоминать термины вроде DDD, микросервисов, брокеров и C4

🆘А для тех, кто хочет системно разобраться в архитектуре, — в ближайшие дни расскажем про обновлённые программы наших курсов

Будет два уровня обучения, чтобы каждый мог выбрать подходящий формат под свой опыт и задачи

А пока выпуск можно посмотреть и послушать здесь:

📱 VK Видео
📱 YouTube
📱 Apple Podcasts
📱 Яндекс Музыка
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥53
Мой воркшоп прошел на ура! Рассказывала, как создавать продукт, который будет приносить деньги и нужен пользователям😎

А помимо воркшопа я соорганизатор сообщества аналитического клуба и мы проводили совместный воркшоп, где просили ребят написать ТЗ на снежинки. Было забавно, посмотрите как парень смеется на последних видео)
12👏2
📌 Границы сервисов

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


👉 Зачем думать о границах:

Не "нарисовать 12 блоков", а ответить: какой сервис за что отвечает и какие данные ему принадлежат.

Хорошая граница:
▫️ Совпадает с бизнес-возможностью (заказ, оплата, доставка)
▫️ Имеет свой жизненный цикл данных — другие сервисы не лезут в чужую БД
▫️ Меняется относительно независимо: можно выкатить оплату, не трогая каталог


👉 Как искать границы на практике:

1️⃣ По процессу — шаги бизнес-процесса → кандидаты в сервисы (но не каждый шаг = сервис)
2️⃣ По данным — у кого «источник правды» для сущности? Заказ живёт в Order Service, не в Payment
3️⃣ По нагрузке и НФТ — если расчёт ETA тормозит всё, его можно вынести, не дробя монолит на 20 частей
4️⃣ По команде — Conway's law: структура системы повторяет структуру коммуникации команд


👉 Красные флаги плохого разбиения:

▫️ Два сервиса пишут в одну таблицу
▫️ Синхронная цепочка из 5+ вызовов на каждый клик пользователя
▫️ "Общая" БД с JOIN-ами между доменами — признак того, что граница проведена на схеме, а не в голове


💡 На Middle от аналитика ждут не определение DDD, а умение объяснить: "Мы выделили сервис оплаты, потому что у него отдельный SLA, PCI-ограничения и свой релизный цикл".
8
📰 Новости | Роль аналитика в эпоху ИИ, как пересобрать архитектуру

Forrester выпустил отчёт «Rearchitecting Applications For The Age Of AI» — исследование о том, как ИИ меняет логику построения корпоративных систем.

Раньше архитектура строилась вокруг жёстких BPM-схем и предсказуемых цепочек вызовов. ИИ добавляли как очередной микросервис. Forrester пишет: это не работает. ИИ требует пересмотреть сам подход к проектированию: от пошаговых процессов — к границам и целям.

👉 Что нового важно для системного аналитика:

▫️ Адаптивная оркестрация вместо BPM — ИИ-агенты принимают решения в рантайме. Аналитику нужно описывать не "шаг 1 → шаг 2 → шаг 3", а границы, цели и контекст, внутри которых ИИ сам выстроит траекторию.
▫️ Приложения генерируются по описанию — пользователи или агенты создают временные приложения под задачу естественным языком. Фокус смещается с проектирования статичных систем на проектирование многократно используемых бизнес-сервисов.
▫️ Контекст становится архитектурным слоем — ИИ-агентам нужны не просто данные, а их семантическое значение в реальном времени. Появляется слой управления контекстом (стандарты вроде MCP указывают, как он может развиваться).

👉 Что это значит на проекте:

- Уходит слой Experience API — теперь ИИ-агент будет адаптировать бизнес-логику под интерфейс (мобилка/веб/чат) напрямую, обращаясь к Business API.
- Новые требования к API — ИИ плохо работает с низкоуровневыми техническими API. Нужны чёткие бизнес-сервисы, которые инкапсулируют намерение, правила и результат.
- Меняются НФТ — вместо контроля каждого пути проектируем безопасные границы (guardrails), внутри которых ИИ-агент действует автономно.

💡 Для собеседования: если спрашивают «как изменится роль аналитика через 2–3 года», уверенный ответ уровня Senior — смещение фокуса с линейных UX-потоков на проектирование бизнес-возможностей, границ оркестрации и семантического слоя данных.

Источник: Forrester «Rearchitecting Applications For The Age Of AI»
8
📂 Кейс: Saga вместо распределённой транзакции — когда "откатить всё" невозможно

🏢 Контекст:

B2B-портал закупок. Заказ проходит: резерв на складе → списание лимита бюджета → создание счёта в ERP → уведомление поставщику. Четыре разных системы, у ERP нет двухфазного commit. Команда 12 человек, монолит режут на сервисы.


😬 Проблема:

После выноса "Склад" и "Бюджет" в отдельные сервисы поймали баг: лимит списали, ERP вернула 500 — заказ завис "в полупути". Ручные откаты в саппорте — 2–3 раза в неделю. Бизнес: "Нужна атомарность как в старом монолите".


🔍 Что сделал аналитик:

1. Нарисовал happy path и точки отказа — где уже нельзя просто DELETE
2. Выбрал оркестрацию Saga (центральный Order Orchestrator), а не хореографию: процесс линейный, мало автономных реакций, нужна видимость статуса для саппорта
3. Описал компенсирующие транзакции:
— Отмена резерва на складе
— Возврат лимита бюджета
— Аннулирование черновика счёта в ERP (отдельный API)
4. Зафиксировал идемпотентность шагов по order_id + step_id — повтор после таймаута не дублирует списание
5. В ТЗ добавил статусы заказа: PENDING_BUDGETPENDING_ERPCONFIRMED / COMPENSATING / FAILED


Результат:

За 6 недель — orchestrator на state machine, дашборд "застрявших" саг. Ручных откатов — 0 за два месяца. Бизнес принял, что при падении ERP заказ может минуту быть в COMPENSATING, но не «зависнуть навсегда».


💡 Выводы:

▫️ Распределённая транзакция 2PC в микросервисах — редкость; Saga + компенсации — рабочая модель
▫️ Оркестрация vs хореография — не религия, а наблюдаемость и сложность процесса
▫️ Аналитик обязан описать что откатываем и в каком порядке, иначе разработчики напишут "retry" и забудут
2👏1