BA & SA | 10000 Interview questions
10.2K subscribers
175 photos
14 videos
346 links
Вопросы и задачи, которые задают на собеседованиях на позицию Бизнес и Системного аналитика. По вопросам сотрудничества- @DeliveryManager7
Download Telegram
👩‍🏫Объяснение:
Идемпотентность — это не просто техническое требование, а ключевой принцип проектирования надежных интеграций в распределенных системах, где сетевые сбои, таймауты и повторные отправки запросов — это норма.
Почему это так важно?
Представьте, что клиентское приложение отправляет запрос на списание денег, но не получает ответ из-за обрыва сети. Что делает разумный клиент? Он отправляет запрос повторно. Без идемпотентности это привело бы к двойному списанию — катастрофическая ошибка.
С идемпотентностью:
* Сколько бы раз ни пришел идентичный запрос (с одним и тем же payment_id и суммой), сервис платежей обработает его так, будто это первый раз, и вернет тот же результат. Деньги спишутся один раз.
Как это достигается на практике?
1. Использование уникальных ключей: Сервис сохраняет ID обработанного запроса и проверяет, не обрабатывался ли он уже.
2. Семантика HTTP-методов: Методы GET, PUT, DELETE по спецификации должны быть идемпотентными. POST — не идемпотентен (каждый вызов создает новый ресурс), поэтому для него нужно предусматривать механизмы идемпотентности отдельно.
3. Пример из жизни: Нажатие кнопки «Отправить» в лифте. Сколько бы вы ни нажимали на кнопку этажа, лифт поедет только один раз на нужный этаж.
Роль системного аналитика: При описании интеграционных API вы должны явно указывать, какие операции должны быть идемпотентными (особенно изменяющие состояние: обновление статуса, списания, отмены), и обеспечивать это требование в контракте.
№4612 категория вопросов: #INTEGRATION
👩‍🏫Объяснение:
Graceful Degradation (Плавная деградация) — это архитектурный принцип проектирования отказоустойчивых систем. Его цель — максимально сохранить пользовательский опыт и работоспособность ядра системы, даже когд а некоторые её части выходят из строя.
Почему это не просто «работать несмотря ни на что»?
Ключевая мысль — приоритизация. Система должна понимать, какие сервисы критичны для её основной функции, а какие — дополняют её.
Конкретные примеры для аналитика:
1. Интернет-магазин:
* Критичный сервис: Корзина, оформление заказа, платежный шлюз. Без них система не работает.
* Некритичный сервис: Рекомендательный движок («Похожие товары»), сервис отзывов, виджет прогноза доставки.
* Поведение при деградации: Если упал рекомендательный сервис, страница товара должна загрузиться, просто блок «С этим товаром покупают» будет пустым или покажет заглушку. Пользователь все равно сможет положить товар в корзину и купить его.
2. Мобильное приложение соцсети:
* Некритичный сервис: Сервис для загрузки аватарок в высоком разрешении.
* Поведение при деградации: Если сервис аватарок недоступен, приложение покажет аватарки из низкокачественного кэша или стандартную иконку, но лента новостей будет продолжать работать.
Как это связано с требованиями?
Системный аналитик должен:
* Выявить и классифицировать зависимости: Составить матрицу зависимостей системы и отметить, какие из них критичны для бизнес-целей.
* Сформулировать нефункциональные требования: «При недоступности сервиса рекомендаций в течение более 5 секунд, система должна отображать основной контент страницы, скрыв блок рекомендаций, и залогировать инцидент».
* Продумать сценарии отказов: В сценариях использования (use case) описывать не только happy path, но и ветки поведения при недоступности тех или иных служб.
№4613 категория вопросов: #INTEGRATION
👩‍🏫Объяснение:
Point-to-Point (P2P) — это наивный подход к интеграции, при котором каждая система взаимодействует с другой напрямую, по собственному, уникальному для каждой пары протоколу и формату данных.
Почему это становится проблемой?
Формула количества потенциальных связей для N систем: N * (N-1) / 2. Для 5 систем это 10 связей, для 10 систем — уже 45, для 20 — 190 связей. Каждая связь — это:
* Отдельный коннектор/адаптер.
* Свой формат сообщений (XML, JSON, CSV, фиксированная длина).
* Свой протокол (HTTP, FTP, JDBC, сокеты).
* Своя логика обработки ошибок и повторных попыток.
Конкретные последствия для бизнеса и разработки:
1. Неподдерживаемость: Чтобы изменить формат данных в одной системе, нужно найти и обновить все системы, которые с ней взаимодействуют. Это долго, дорого и чревато ошибками.
2. Отсутствие контроля и видимости: Нет единой точки, через которую проходят все данные. Невозможно централизованно применять политики безопасности, логировать все сообщения, отслеживать производительность интеграций или внедрить сквозную трассировку транзакций.
3. Сложность тестирования: Чтобы протестировать изменение в одной системе, нужно поднимать и настраивать все системы, от которых она зависит и которые от неё зависят.
4. Риск возникновения «тихой» поломки: Система A изменила поле в сообщении для системы B. Система C, которая тоже читает это сообщение (но об этом забыли), ломается, потому что не ожидает нового формата.
Альтернативы, которые должен знать аналитик:
* Интеграционная шина (ESB): Централизованный посредник, который берет на себя трансформацию и маршрутизацию данных.
* Шина событий (Event Bus): Системы публикуют события в общую шину, а подписчики получают их, не зная об отправителе (слабая связанность).
* API Gateway: Унифицированный вход для внешних клиентов.
Роль аналитика: Выявлять подобные хаотичные связи на ранних этапах анализа существующей архитектуры (as-is) и предлагать в целевом состоянии (to-be) консолидацию интеграций через стандартизированные интерфейсы и централизованные узлы.
№4614 категория вопросов: #INTEGRATION
👩‍🏫Объяснение:
Dead Letter Queue (DLQ) — это не просто «мусорная корзина», а важнейший инструмент обеспечения надежности и наблюдаемости в асинхронных системах.
Как работает типичный сценарий с DLQ:
1. Получение сообщения: Сервис-получатель (консьюмер) берет сообщение из основной очереди.
2. Ошибка обработки: Сообщение не может быть обработано. Причины:
* Ошибка в данных: Неверный формат, отсутствует обязательное поле, ссылка на несуществующую сущность (например, order_id=999999).
* Ошибка в бизнес-логике: Нарушение инварианта (например, попытка отгрузить товар с отрицательным остатком).
* Внешняя недоступность: Сервис-получатель зависит от другой системы (БД, API), которая временно недоступна.
3. Повторные попытки (Retry): Консьюмер не удаляет сообщение сразу. Он помечает его как необработанное и возвращает в очередь (или откладывает). Сообщение будет предпринято несколько попыток (например, 3 или 5) с интервалом.
4. Помещение в DLQ: Если после всех попыток сообщение все еще не может быть обработано, брокер (например, RabbitMQ, AWS SQS) автоматически перемещает его в специальную очередь — Dead Letter Queue.
Зачем это нужно? Без DLQ было бы так:
* «Отравленное» сообщение вечно циркулировало бы в основной очереди, постоянно вызывая ошибки и загружая логи.
* Оно могло бы блокировать обработку других, корректных сообщений, стоящих за ним в очереди (в FIFO-очередях).
* Невозможно было бы выявить систематическую ошибку в данных или коде без ручного поиска в логах.
Практическое применение DLQ:
1. Изоляция проблемы: Основная очередь очищается от битого сообщения и продолжает нормально работать.
2. Аварийное оповещение: Факт попадания сообщения в DLQ — это триггер для отправки алерта команде разработки или поддержки (CRITICAL: Сообщения падают в DLQ!).
3. Анализ и отладка: Инженер может вручную взять сообщение из DLQ, изучить его содержимое, понять причину сбоя (валидация, баг, проблема во внешней системе).
4. Восстановление (Replay): После того как причина устранена (баг исправлен, данные подправлены), сообщения из DLQ можно вернуть в основную очередь для повторной, уже успешной, обработки.
Роль системного аналитика: При проектировании интеграций через очереди требовать настройки DLQ и прописывать в требованиях процесс реагирования на попадание туда сообщений (мониторинг, алертинг, процедуры анализа).
№4615 категория вопросов: #INTEGRATION
👩‍🏫Объяснение:
В монолитной системе с одной базой данных согласованность обеспечивается ACID-транзакциями (Atomicity, Consistency, Isolation, Durability). Вы можете обновить 5 таблиц в одной транзакции, и либо все изменения применятся, либо ни одно.
В микросервисной архитектуре это невозможно:
* У каждого сервиса своя база данных.
* Невозможно использовать распределенные 2PC (Two-Phase Commit) транзакции из-за проблем с производительностью, блокировками и доступностью.
* Бизнес-транзакция (например, «Оформить заказ») затрагивает несколько сервисов: Заказы, Платежи, Склад, Доставка.
Как же обеспечить, чтобы либо все сервисы выполнили свою часть, либо ни один? Здесь на помощь приходит Saga.
Суть паттерна Saga:
Saga разбивает единую ACID-транзакцию на последовательность локальных транзакций, каждая в своем сервисе. Каждая локальная транзакция публикует событие, которое запускает следующую локальную транзакцию в другом сервисе.
Ключевой элемент Saga — Компенсирующие транзакции (Compensating Transactions):
Если на каком-то шаге Saga происходит ошибка, система должна «откатиться». Но просто «удалить заказ» в базе сервиса Заказов — недостаточно. Нужно выполнить логически обратные действия:
* Не delete order, а set order status = CANCELLED.
* Не delete payment, а initiate refund (запустить процесс возврата денег).
* Не delete reservation, а release stock (вернуть товар на склад).
Типы реализации Saga:
1. Оркестрация (Orchestration): Есть центральный оркестратор (отдельный сервис), который командует, что делать каждому сервису и в каком порядке. Он знает всю логику Saga и управляет компенсациями.
2. Хореография (Choreography): Сервисы общаются друг с другом через события, без центрального дирижера. Каждый сервис знает, на какие события ему реагировать и какие события публиковать после этого. Компенсация также запускается событиями.
Пример Saga «Оформление заказа» (Хореография):
1. Order Service: Создает заказ в статусе PENDING, публикует OrderCreated.
2. Payment Service (подписан на OrderCreated): Списывает деньги, публикует PaymentCompleted.
3. Warehouse Service (подписан на PaymentCompleted): Резервирует товар, публикует StockReserved.
4. Order Service (подписан на StockReserved): Меняет статус заказа на CONFIRMED. Saga завершена успешно.
Сценарий ошибки (откат):
Если Warehouse Service не может зарезервировать товар (нет на складе), он публикует StockReservationFailed.
* Payment Service (подписан на StockReservationFailed): Запускает возврат денег (компенсирующая транзакция), публикует PaymentRefunded.
* Order Service (подписан на PaymentRefunded или StockReservationFailed): Меняет статус заказа на CANCELLED.
Роль системного аналитика: При проектировании сквозных бизнес-процессов в микросервисной архитектуре необходимо явно моделировать Saga. Нужно:
1. Определить границы и шаги бизнес-транзакции.
2. Спроектировать события, которые будут связывать шаги.
3. Самый важный этап: Для каждого шага определить и описать компенсирующую транзакцию. Что делать, если следующий шаг не удался? Отмена, возврат, уведомление?
4. Выбрать подходящий тип реализации (оркестрация или хореография).
Это сложный, но абсолютно необходимый паттерн для поддержания целостности данных в современных распределенных системах.
№4616 категория вопросов: #INTEGRATION
👩‍🏫Объяснение:
Backpressure (Обратное давление) — это механизм устойчивости и саморегулирования в системах, работающих с потоками данных. Его можно сравнить с предохранительным клапаном в водопроводе, который не дает трубе разорваться при слишком высоком давлении.
Классическая проблема без Backpressure:
1. Продюсер (Producer) генерирует сообщения с высокой скоростью (например, 10 000 в секунду).
2. Консьюмер (Consumer) может стабильно обрабатывать только 1 000 сообщений в секунду.
3. Сообщения начинают накапливаться в очереди (буфере).
4. Очередь переполняется → потребляется вся доступная память → процесс консьюмера (или брокера) падает с OutOfMemoryError. Система ломается.
Как работает Backpressure?
Это сигнальная обратная связь от получателя к отправителю. Консьюмер явно или неявно сообщает: «Стоп! Я перегружен, присылай данные медленнее или подожди».
Реализации в разных технологиях:
* На уровне TCP: Протокол TCP имеет встроенный механизм контроля перегрузки (congestion control) — получатель указывает размер своего приемного буфера (window size).
* Reactive Streams (RxJava, Project Reactor): Это стандартизированная модель, где Subscriber запрашивает у Publisher N элементов, и только после их обработки запрашивает следующую порцию (request(N)).
* Apache Kafka: Консьюмеры сами управляют offset'ами. Если консьюмер отстает, он просто не перемещает offset дальше, и сообщения остаются в партиции. Продюсер же может регулировать отправку на основе мониторинга отставания (lag) консьюмеров.
* HTTP/2 и gRPC: Поддерживают механизмы управления потоком (flow control).
Почему это важно для аналитика?
При проектировании высоконагруженных интеграций необходимо понимать не только happy path, но и поведение системы под нагрузкой. Нужно задавать вопросы:
* Что произойдет, если источник данных начнет генерировать информацию в 100 раз быстрее, чем обычно?
* Есть ли в нашей архитектуре механизмы, которые не дадут системе-приемнику «утонуть» в таком потоке?
* Как система сообщит о перегрузке? (Через метрики? Через падение? Через замедление?)
Без Backpressure система либо теряет данные (если очередь ограничена), либо падает. С Backpressure она устойчиво снижает производительность, но продолжает работать, давая время на масштабирование или устранение проблемы.
№4617 категория вопросов: #INTEGRATION
№4618 категория вопросов: #INTEGRATION
4618. Какой подход позволяет системам обмениваться данными напрямую, без промежуточных компонентов?
Anonymous Quiz
11%
Паттерн «Общая база данных»
74%
Прямая интеграция Point-to-Point
10%
Использование Enterprise Service Bus
5%
Шина событий (Event Bus)
👩‍🏫Объяснение:
Point-to-Point (P2P, «точка-точка») — это самый простой подход к интеграции, при котором две системы соединяются напрямую, без посредников.

Как это работает:

Система A знает точный адрес и протокол системы B
Отправляет данные напрямую (например, через HTTP-вызов или прямой доступ к БД)
Система B принимает и обрабатывает запрос
Пример: Мобильное приложение вызывает REST API бэкенда напрямую.

Плюсы:

Простота начальной реализации
Минимальная задержка (нет промежуточных звеньев)
Минусы (и почему это часто антипаттерн):
При добавлении третьей, четвертой системы количество связей растет экспоненциально
Создает «спагетти-архитектуру», которую невозможно поддерживать
Нет централизованного управления, логирования, мониторинга
Высокая связанность: изменение в одной системе требует изменений во всех связанных