4809. Команда выкатывает обновление микросервиса, которое меняет формат запроса к другому сервису. Новая версия совместима со старым форматом, но новый формат не поддерживается старым сервисом. Как организовать rollout без простоя?
Anonymous Quiz
3%
Остановить все сервисы, обновить их по очереди и включить
97%
Использовать стратегию «сначала обратно-совместимые изменения, затем обновить потребителей
0%
Сделать обновление за один день, ничего не проверяя
0%
Переписать всё заново
В распределённых системах нельзя одновременно обновить все сервисы. Нужно делать обратно-совместимые изменения (additive changes). То есть сначала добавить новое поле в API, не удаляя старое. Старые клиенты продолжают работать. Затем обновить потребителей, чтобы они начали использовать новое поле. И только когда все потребители перешли на новую версию, можно удалить старое поле (ломающее изменение).
Как избежать простоя
Фаза 1: добавить новый параметр в запрос (опционально). Старый сервис его игнорирует.
Фаза 2: обновить все вызывающие сервисы, чтобы они передавали новый параметр.
Фаза 3: изменить логику сервиса-приёмника, чтобы он требовал новый параметр.
На каждом этапе система продолжает работать.
Почему A не подходит
Остановка всех сервисов — это downtime, которого можно избежать.
C и D — нереалистичны.
Реальный инструмент
Feature flags, versioned APIs, graceful shutdown. Аналитик должен в требованиях указывать, что изменения API должны быть обратно совместимыми или идти через версионирование.
Please open Telegram to view this post
VIEW IN TELEGRAM
В этой папке собраны каналы по ИИ, которые помогают быстрее разобраться в сфере, находить идеи и экономить время на поиске информации.
Please open Telegram to view this post
VIEW IN TELEGRAM
4810. Спринт на 3 недели. Есть критический баг (теряются 5% заказов) и новая фича (повысит продажи на 10%). На оба задачи не хватает времени. Что делать аналитику?
Anonymous Quiz
0%
Взять фичу, так как она даст больше прибыли
100%
Организовать встречу с бизнесом, показать цифры и решить, что важнее, зафиксировать компромисс
0%
Сделать и то, и другое, сократив тестирование
0%
Отдать решение архитектору
Каждый спринт разработчики сталкиваются с дилеммой: баг фиксить или фичу делать. Баг теряет 5% заказов — это реальные деньги здесь и сейчас. Фича даст +10% продаж, но не сразу и с риском. Без аналитика команда может выбрать неоптимально.
Что делает хороший аналитик
Собирает цифры:
Потери от бага = 5% от текущей выручки (например, 1 млн руб./день).
Ожидаемый доход от фичи = 10% прироста, но после внедрения (через 3 недели).
Показывает бизнесу. Уточняет, можно ли отложить баг на час (неделю) – обычно нельзя, так как потери растут. Затем организует встречу со стейкхолдерами (владельцем продукта, маркетингом, поддержкой) и вместе определяют приоритет по бизнес-ценности. Возможные варианты:
Сначала фикс бага (1 неделя), затем MVP фичи (2 недели).
Перенести фичу на следующий спринт, но получить план компенсации (скидка на доставку).
Важно зафиксировать решение в протоколе, чтобы потом не было споров. Аналитик не должен выбирать сам — он фасилитатор.
Что будет, если выбрать A (фичу) без согласования
Бизнес потеряет 5% заказов за 3 недели; через месяц фича может не окупить потерь.
Что будет, если B (сделать всё, сократив тестирование)
Выпустите баг ещё больше, либо фича окажется с дефектами.
Реальный пример
В Delivery Club аналогичный конфликт решили взвешиванием: баг с потерей заказов — must have, новая фича — could have. Бизнес согласился отложить фичу.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
4811. Сервис отправки email иногда отвечает 500 ошибкой. При повторе письмо уходит дважды. Как требование должно защитить от дублей?
Anonymous Quiz
0%
Не повторить, а ловить ошибку и оповещать администратора
98%
Добавить уникальный идентификатор письма и проверять на стороне email-сервиса, было ли такое письмо
0%
Увеличить таймаут соединения
2%
Перестать пользоваться этим сервисом
Письма клиентам (со сбросом пароля, подтверждением заказа) не должны дублироваться. Но все внешние сервисы могут выдавать временные ошибки 5xx, и клиент, повторив запрос, рискует получить два письма.
Решение – идемпотентность на стороне получателя
В запросе на отправку письма нужно передавать уникальный идентификатор (например,
message_idДетали в требованиях
«Перед отправкой письма система должна генерировать уникальный
message_idorder_id + timestamp«Email-сервис должен реализовать проверку идемпотентности: если запрос с таким
message_id200 OK«Хранить ID не менее 24 часов для защиты от коллизий при сетевых задержках».
Почему не подходят другие варианты
A (не повторять) – письма могут теряться из-за сетевого сбоя. Надёжность упадёт.
C (увеличить таймаут) – не решает дублирование при повторе (пользователь нажал «отправить» дважды).
D (перестать пользоваться) – нереалистично.
Реальный кейс
Банк отправлял SMS с одноразовым кодом. Из-за ошибки в биллинге при повторе отправлялось две SMS. Клиенты путали код. После внедрения
message_idPlease open Telegram to view this post
VIEW IN TELEGRAM
4812. Запрос на выборку клиентов с суммой покупок > 1000 рублей:
SELECT client_id, SUM(amount) FROM orders GROUP BY client_id HAVING SUM(amount) > 1000.
Запрос выполняется 8 секунд. Как ускорить без сложных архитектурных изменений?
SELECT client_id, SUM(amount) FROM orders GROUP BY client_id HAVING SUM(amount) > 1000.
Запрос выполняется 8 секунд. Как ускорить без сложных архитектурных изменений?
Anonymous Quiz
27%
Добавить индекс на client_id
67%
Создать материализованное представление предрасчитанными суммами по клиентам, обновляемое раз в час
5%
Партиционировать таблицу по дате
1%
Увеличить память сервера
❤1
Партиционирование по дате уменьшит объём сканирования, если в
WHEREМатериализованное представление (MV)
MV хранит предрассчитанный результат запроса:
SELECT client_id, SUM(amount) as total FROM orders GROUP BY client_idЗанимает места ~ (кол-во клиентов) × (несколько байт).
Обновляется инкрементально после каждого изменения в
ordersЗапрос к MV вместо основной таблицы выполняется за миллисекунды (читает всего N строк).
В требованиях нужно указать:
«Для отчёта "топ клиентов" использовать материализованное представление
client_totals«Обновлять представление раз в час (допустима задержка)».
«При изменении данных (INSERT/UPDATE) в
ordersРеальный пример
В CRM-системе отчёт «крупнейшие покупатели» грузился 30 секунд. После создания MV с ежечасным обновлением время упало до 0.2 секунды.
Please open Telegram to view this post
VIEW IN TELEGRAM
4813. Стартап с 5 разработчиками и нагрузкой 100 запросов/сек хочет микросервисы «как у Google». Какой главный риск?
Anonymous Quiz
4%
Микросервисы потребляют больше памяти, чем монолит
94%
Избыточная инженерная сложность замедлит разработку и не даст преимуществ при такой нагрузке
1%
Микросервисы не умеют работать с транзакциями
1%
Несовместимость с облачными провайдерами
Микросервисы решают проблемы масштаба (тысячи разработчиков, миллионы запросов). Для маленькой команды они вводят накладные расходы:
Настройка Kubernetes, сервис-меша, дата-центра или кластера.
Отладка распределённых транзакций – запрос идёт через 5 сервисов, ошибку трудно воспроизвести.
Развёртывание: нужно вызывать CI/CD для каждого сервиса (минимум 3–4).
Мониторинг и логи – собирать их с нескольких сервисов сложнее.
При 100 запросах/сек и 5 разработчиках монолит с чёткими модулями будет работать не хуже, а разработка пойдёт быстрее.
Что делать вместо?
Модульный монолит с чёткими границами пакетов. Если в будущем нагрузка вырастет до 1000+ запросов/сек, легко выделить узкие места в отдельные сервисы.
Реальные примеры
Instagram долгое время был монолитом на Django.
Twitter начинал с монолита Ruby on Rails, а микросервисы внедрял, когда столкнулся с миллионами запросов.
Что аналитик должен рекомендовать
Оценить масштаб (100 запросов/сек – смешная нагрузка для современного сервера).
Оценить команду (5 человек – не нужно разделять).
Указать в NFR не «микросервисы», а «архитектура должна позволять горизонтальное масштабирование и выделение сервисов при росте нагрузки».
Вывод
Не усложняйте. Самая быстрая архитектура для малой команды – монолит с чистыми интерфейсами.
Please open Telegram to view this post
VIEW IN TELEGRAM
4814. Через месяц после утверждения требований заказчик просит добавить новое поле «скидка постоянного клиента» в форму заказа. Команда уже на середине спринта. Какой процесс нужно запустить?
Anonymous Quiz
2%
Сразу добавить поле, не спрашивая
97%
Оценить влияние, согласовать с командой, предложить варианты и зафиксировать решение в протоколе
1%
Отказать, потому что требования утверждены
0%
Передать решение архитектору
Изменения требований в середине спринта — норма. Бизнес не обязан ждать. Но нельзя их принимать без анализа.
Правильный процесс
Оценка влияния: сколько часов займёт (разработка, тестирование, документация), затронет ли другие модули, какой риск регресса.
Переговоры: можно ли перенести другую задачу, отложить текущую реализацию?
Решение: формальное согласование с заказчиком (если есть бюджет, время). Фиксация в протоколе изменений.
Почему не другие варианты
A – хаос, потеря контроля, срыв сроков.
C – негибкость, потеря доверия.
D – архитектор не владеет приоритетами бизнеса.
Реальный пример
В крупном ретейле заказчик попросил добавить отчёт по магазинам за прошлый месяц. Оценка показала 3 дня. Вместо срыва спринта договорились перенести менее важную фичу. Изменение задокументировали.
Please open Telegram to view this post
VIEW IN TELEGRAM
4815. Партнёр передаёт данные о заказах в виде CSV-файлов по FTP. Система иногда обрабатывает один и тот же файл дважды из-за дублирования имён. Как избежать повторной обработки?
Anonymous Quiz
44%
Переименовывать файл после обработки
42%
Использовать контрольный файл
14%
Удалять файл сразу после чтения
1%
Обрабатывать файлы только вручную