Выдерните вилку из розетки. Нажмите на кнопку экстренной остановки. Эти инстинкты работают, когда вы стоите рядом с одной машиной. Они подводят, когда ваша ИИ-система охватывает пятьдесят узлов в трех зонах доступности. Большинство инженерных команд учатся этому на собственном горьком опыте. Они обновляют центральную базу данных, меняют булево значение с true на false и полагают, что система остановится. Но это не так. База данных выглядит чистой. Сервис все еще работает.

Иллюзия одного выключателя

Представьте себе контроллер, который фиксирует отзыв прав на эпохе 12. Он записывает изменения в постоянное хранилище и вздыхает с облегчением. Тем временем Воркер B работает на кэшированном разрешении эпохи 11. Воркер так и не получил уведомление. Тридцать секунд спустя он запускает задачу инференса модели, разворачивает GPU-кластер или вызывает внешний API. Аудит-лог говорит, что доступ был отозван. Действие все равно произошло.

В этом и заключается разрыв между персистентностью и распространением. Запись в базу данных — это не состояние системы. Это всего лишь одна строка в одной таблице, а множество участников вашей системы никогда не опрашивают эту таблицу именно в тот момент, когда им это необходимо. Если вы относитесь к экстренной остановке как к обычному выключателю света, вы обнаружите, что в некоторых углах комнаты темнота так и не наступила.

Суровая реальность распределенных систем

Вы должны проектировать систему с расчетом на сбои. Не на случайные сбои. На постоянные, хаотичные, независимые сбои. Воркеры перезагружаются посреди выполнения задачи. Потребители очередей отстают на минуты. Сервисы авторизации возвращают устаревшие данные, потому что одна из реплик зависла. Сообщения дублируются. Сообщения исчезают. Сообщения приходят в неверном порядке. Ваш демон NTP дрейфует, и внезапно один узел начинает считать, что он отстает от остальных на десять секунд. Часы ошибаются, и вы не можете полагаться на реальное время для упорядочивания событий между границами системы.

Если ваш протокол экстренной остановки предполагает надежные сети, упорядоченную доставку сообщений или синхронизированные часы, то у вас нет протокола. У вас есть лишь надежда. Воркеры, потребители очередей и сервисы авторизации выходят из строя независимо друг от друга. Ваши правила безопасности должны соблюдаться даже тогда, когда инфраструктура кажется активно враждебной.

Пять правил, которые действительно работают

Безопасность обеспечивается инвариантами, которые выживают в хаосе. Вот правила, которые не позволяют отзыву прав превратиться в фикцию.

Ни одно действие не должно начинаться с эпохой разрешения ниже эпохи отзыва.
Это ваш основной предохранитель. Каждое предоставление прав несет в себе номер эпохи. Каждый отзыв несет в себе более новый номер. Прежде чем совершить любое действие, воркер сравнивает эти числа. Если эпоха разрешения воркера старше, чем последняя увиденная им эпоха отзыва, воркер останавливается. Эпохи дают вам логические часы, которые не зависят от системных часов. Воркер, владеющий эпохой 11, должен отказаться от начала работы, как только узнает, что эпоха 12 отозвала лежащие в основе полномочия.

Кэшированные разрешения должны истекать в течение установленного лимита времени.
Разрешение никогда не должно жить в памяти вечно. Воркеры должны повторно подтверждать или аннулировать свои права через определенный интервал. Без этого узел, ушедший в офлайн, может проснуться через дни или недели и выполнить действие, используя «ископаемое» разрешение. Установите срок аренды (lease). Строго соблюдайте его. Время станет вашим автоматическим механизмом очистки.

Перезапуск системы не может уменьшить сохраненную эпоху.
Персистентность имеет значение. Если контроллер аварийно завершает работу и перезапускается, он должен восстановить самую высокую эпоху, которую он когда-либо выпускал. Откат к более старой эпохе воскресит отозванные разрешения, как если бы экстренная остановка никогда не происходила. Сохраняйте эпоху надежно перед тем, как транслировать ее. Используйте журнал предзаписи (write-ahead log), подтвержденный fsync или реплицируемую группу консенсуса. История движется только вперед.

**Дублирование отз...