Вы прикладываете карту к турникету — он открылся. Денег на счёте ноль. Как так?
Сосед прикладывает Тройку — открылось, сервер даже не спросили. Человек впереди посмотрел в камеру — открылось, лицо обработал сервер тут же, в вестибюле. Одна железка — три принципиально разных архитектуры. Одновременно.
Тройка — автономно
Чип на карте хранит баланс, он и есть источник истины. Турникет считывает локально — решение за миллисекунды, без сервера. Упадут все серверы метро — Тройка продолжит работать. С 2024-го турникет ещё и дозаписывает отложенное пополнение на чип прямо при проходе: пополнили через приложение, а баланс обновится, когда приложите карту.
Банковская карта — сначала пусти, потом разберись
Турникет проверяет одно: нет ли карты в стоп-листе (карты, с которых метро не смогло списать за прошлые поездки). Нет — открываюсь. Списание позже: сначала авторизация (блокируется 1 рубль), потом клиринг на полную стоимость.
Денег на счёте ноль — турникет всё равно откроется. Он не знает ваш баланс, а стоп-лист обновляется не в реальном времени.
Метро осознанно берёт этот риск: остановить поток людей дороже, чем потерять 83 рубля.
Face Pay — распознавание на месте
Гонять каждое лицо в облако слишком медленно, поэтому в каждом вестибюле стоят edge-серверы с копией математических слепков лиц. Сравнение — тут же, за доли секунды. Но упадёт этот сервер — Face Pay встанет. Единственный из трёх зависит от вычислений на месте.
Все три — ответ на один вопрос: что должно работать, даже когда связи нет? Тройка — всегда, ей связь не нужна. Карта — пока стоп-лист не протух. Face Pay — пока жив сервер в вестибюле. Каждая архитектура ошибается по-своему и чем-то жертвует ради главного.
По сути — CAP-теорема, отлитая в железе турникета.