Где и что нужно хранить для обеспечения устойчивости к сбоям в задаче автоотклонения звонков
Что проверяют
Умеете ли вы разложить ML-сервис на данные с разной ценой потери: модель, признаки, настройки пользователя, журнал решений. Главное уточнение почти всегда одно: что система делает со звонком, если хранилище признаков или модель недоступны.
Как отвечать
Сначала назовите ограничение: решение нужно за десятки миллисекунд, пока телефон не зазвонил, поэтому в синхронном пути не должно быть медленных и хрупких зависимостей. Дальше по слоям:
- артефакты модели: версионированный реестр (MLflow поверх S3-совместимого хранилища). Узел инференса держит локальную копию текущей версии и поднимается без сети;
- онлайн-признаки: репутация номера, число звонков за час, жалобы. Хранилище с низкой задержкой и репликацией, например Redis с репликами или Cassandra. Счётчики пересобираются из потока событий, так что потеря узла не катастрофа;
- настройки пользователя: белые и чёрные списки, режим фильтра. Их терять нельзя: основная БД с синхронной репликой и кэш рядом с сервисом;
- журнал решений: номер, признаки, версия модели, скор, итог. Асинхронно в Kafka с репликацией и
acks=all, оттуда в хранилище для обучения. Нужен для разбора жалоб, мониторинга дрейфа и переобучения; - идемпотентность: идентификатор звонка как ключ, чтобы повторная доставка события не посчитала звонок дважды.
Отдельно опишите деградацию. На каждый вызов таймаут, при отказе модели работают правила по кэшированным спискам, при полном отказе звонок пропускается (fail-open): пропущенный спам дешевле отклонённого звонка из больницы. Явный чёрный список пользователя при этом работает из локального кэша.
Где спотыкаются
Отвечают общими словами про бэкапы и кластеризацию, не разделяя данные по критичности. Ночная резервная копия не поможет решению, которое нужно через 50 мс.
Не проговаривают поведение при отказе. Интервьюер ждёт явного выбора между fail-open и fail-closed с объяснением цены каждой ошибки.
Не сохраняют версию модели и признаки рядом с решением. Потом не объяснить конкретное отклонение и не собрать выборку без расхождения между обучением и инференсом.