391просмотров
85.7%от подписчиков
27 января 2026 г.
📷 ФотоScore: 430
🤨 Собеседование в крупный дата-центр Секция по системному дизайну (backend, middle+) Вопрос на интервью: спроектировать протокол взаимодействия банкомата и дата центра при выдаче наличных Условия: банкомат работает в ненадёжной среде, дата центр надёжен Требование: деньги списываются только если они физически выданы клиенту Ключевая идея
• идемпотентность
• распределённая транзакция
• приближённый вариант 2PC, без иллюзий Инвариант: деньги нельзя списать, если они не были реально выданы Протокол взаимодействия 1️⃣ Reserve
Банкомат отправляет запрос с transaction_id
Дата-центр:
• проверяет баланс
• резервирует сумму
• не делает финального списания 2️⃣ Dispense
Банкомат:
• получает OK
• выдаёт наличные
• пишет факт выдачи в локальный журнал 3️⃣ Confirm
Банкомат подтверждает выдачу в дата-центр
⚠️ сообщение может потеряться 4️⃣ Finalize
Дата-центр окончательно списывает зарезервированные средства Зачем нужен transaction_id
• ретраи - норма
• повторные запросы не должны приводить к двойному списанию
• все операции должны быть идемпотентны Сбои - это нормально
• Если Confirm не дошёл → транзакция в статусе UNKNOWN
• Деньги не списаны
• При следующей связи: o банкомат сообщает, были ли деньги реально выданы o дальше - reconciliation 📌 Важно
• Это не настоящий 2PC
• Банкомат ненадёжен → координатор ненадёжен
• Exactly once не существует
• Неопределённые состояния допустимы, если они: o редки o контролируемы o разрешимы Такие вопросы любят на backend / fintech / platform ролях уровня middle+. Они хорошо показывают, видел ли человек реальные сбои, а не только идеальные сценарии. DevReady