Разработка системы failover и автозамены AI-агентов
Представьте: AI-агент обрабатывает очередь запросов клиентов, внезапно падает, и все несохранённые диалоги теряются. Без failover простой длится 10–15 минут, пока оператор вручную переназначает задачи. По данным Gartner, каждый час простоя AI-систем обходится в среднем в $300,000 для крупных компаний. Ошибка в модели, исчерпание GPU-памяти, сбой сети — любой из этих сценариев приводит к падению агента. Без автоматического failover команда тратит 10–15 минут на ручное восстановление, а клиенты теряют данные. Мы видели проекты, где потеря checkpoint за 5 минут работы стоила компании $50,000. Наша система решает эту проблему — проектируем автоматическое переключение на резервный агент без потери прогресса. Свяжитесь с нами, чтобы получить оценку вашего проекта за 2 дня.
Почему failover критичен для AI-агентов?
Непрерывные процессы — мониторинг дашбордов, обработка входящих сообщений, долгосрочные RAG-цепочки — требуют отказоустойчивости. Один сбой может стоить тысячи долларов необработанных транзакций. Наша система гарантирует RTO < 5 секунд с warm standby и RPO не более 60 секунд работы. Warm standby восстанавливает работу в 60 раз быстрее cold start — менее 5 секунд вместо 5–15 минут. Избыточность агентов (agent redundancy) снижает риск single point of failure.
Как работает автоматическая замена агента?
Оркестратор каждые 15 секунд проверяет health endpoint каждого агента. При трёх последовательных ошибках агент помечается как failed, его задачи (с checkpoint) переназначаются наименее загруженному здоровому агенту с повышенным приоритетом. Одновременно запускается новый инстанс через Kubernetes или Docker.
Архитектура failover
┌─────────────────────────────────┐
│ Task Queue (Redis/Kafka) │
└────────────┬────────────────────┘
│
┌─────────────▼──────────────┐
│ Orchestrator / Scheduler │
│ (health checks, failover) │
└──────┬─────────────┬────────┘
│ │
┌──────▼───┐ ┌──────▼───┐
│ Agent 1 │ │ Agent 2 │
│ (active) │ │ (standby) │
└──────┬───┘ └──────────┘
│ crash
┌──────▼──────────────────────┐
│ Failover: задачи Agent 1 │
│ переданы Agent 2 (из │
│ checkpoint или очереди) │
└─────────────────────────────┘
Реализация health check и оркестратора
import asyncio
import aiohttp
from datetime import datetime, timedelta
@dataclass
class AgentHealth:
agent_id: str
last_heartbeat: datetime
last_task_completed: datetime | None
consecutive_failures: int
status: str # healthy / degraded / failed
class AgentHealthMonitor:
def __init__(self, failure_threshold: int = 3, heartbeat_timeout: int = 30):
self.failure_threshold = failure_threshold
self.heartbeat_timeout = heartbeat_timeout
self.agent_health: dict[str, AgentHealth] = {}
async def check_agents(self, agent_ids: list[str]) -> dict[str, AgentHealth]:
tasks = [self._check_agent(agent_id) for agent_id in agent_ids]
results = await asyncio.gather(*tasks, return_exceptions=True)
for agent_id, result in zip(agent_ids, results):
if isinstance(result, Exception):
self._record_failure(agent_id, str(result))
else:
self._record_success(agent_id, result)
return self.agent_health
async def _check_agent(self, agent_id: str) -> dict:
url = f"http://{agent_id}:8080/health"
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=5)) as session:
async with session.get(url) as response:
return await response.json()
def _record_failure(self, agent_id: str, error: str):
health = self.agent_health.setdefault(agent_id, AgentHealth(
agent_id=agent_id, last_heartbeat=datetime.utcnow(),
last_task_completed=None, consecutive_failures=0, status="healthy"
))
health.consecutive_failures += 1
if health.consecutive_failures >= self.failure_threshold:
health.status = "failed"
logger.critical(f"Agent {agent_id} marked as FAILED after {health.consecutive_failures} failures")
def get_failed_agents(self) -> list[str]:
return [aid for aid, h in self.agent_health.items() if h.status == "failed"]
def get_healthy_agents(self) -> list[str]:
return [aid for aid, h in self.agent_health.items() if h.status == "healthy"]
class FailoverOrchestrator:
def __init__(self, task_queue: TaskQueue, health_monitor: AgentHealthMonitor,
checkpoint_manager: CheckpointManager):
self.task_queue = task_queue
self.health_monitor = health_monitor
self.checkpoint_manager = checkpoint_manager
async def run_failover_loop(self):
while True:
await asyncio.sleep(15) # проверка каждые 15 секунд
failed_agents = self.health_monitor.get_failed_agents()
if not failed_agents:
continue
healthy_agents = self.health_monitor.get_healthy_agents()
if not healthy_agents:
logger.critical("NO HEALTHY AGENTS AVAILABLE - alerting on-call")
await self._page_oncall("All agents failed")
continue
for failed_agent in failed_agents:
await self._failover_agent(failed_agent, healthy_agents)
async def _failover_agent(self, failed_agent: str, healthy_agents: list[str]):
logger.info(f"Starting failover for agent {failed_agent}")
# Получаем задачи, назначенные упавшему агенту
assigned_tasks = await self.task_queue.get_tasks_for_agent(failed_agent)
for task in assigned_tasks:
# Пробуем восстановиться из checkpoint
checkpoint = await self.checkpoint_manager.load(task.id)
# Выбираем наименее загруженный здоровый агент
target_agent = self._select_least_loaded_agent(healthy_agents)
# Переназначаем задачу с checkpoint
await self.task_queue.reassign_task(
task_id=task.id,
new_agent=target_agent,
checkpoint=checkpoint,
priority=TaskPriority.HIGH # повышаем приоритет для failover задач
)
logger.info(f"Task {task.id} reassigned from {failed_agent} to {target_agent}")
# Помечаем агент как требующий замены
await self._trigger_agent_replacement(failed_agent)
async def _trigger_agent_replacement(self, agent_id: str):
"""Запускаем новый инстанс агента через K8s или Docker."""
if self.is_kubernetes:
await k8s_client.delete_pod(agent_id)
else:
await docker_client.restart_container(agent_id)
Сравнение методов health check
| Метод health check | Задержка (мс) | Нагрузка на агент | Достоверность |
|---|---|---|---|
| HTTP /health | <10 | Минимальная | Высокая |
| TCP heartbeat | <1 | Никакая | Средняя |
| gRPC streaming | <5 | Низкая | Высокая |
Какие стратегии failover выбрать для AI-агентов?
Выбор стратегии зависит от критичности задач. Warm standby — золотая середина: резервный агент загружен моделью и прогрет, но не обрабатывает задачи. Failover занимает менее 5 секунд против 5–15 минут при cold start. Для финансовых транзакций, где каждая секунда на счету, лучше подходит hot standby с RTO менее 1 секунды, но он требует синхронизации состояния и 3× ресурсов. Если же простой допустим, cold start экономит ресурсы, но RTO достигает 15 минут.
Сравнение стратегий failover
| Стратегия | RTO | RPO | Ресурсы | Применение |
|---|---|---|---|---|
| Cold start | 5–15 мин | до 60 сек | Минимум | Некритичные задачи, тесты |
| Warm standby | < 5 сек | до 60 сек | 2× GPU/CPU | Критичные онлайн-процессы |
| Hot standby | < 1 сек | до 1 шага | 3+× GPU/CPU, синхр. | Финансовые транзакции, real-time |
RTO и RPO для AI-агентов
RTO (Recovery Time Objective): время восстановления после сбоя. С warm standby: < 30 сек. С checkpoint + cold start: 5–15 мин. RPO (Recovery Point Objective): потеря данных/прогресса. С checkpoint каждые 60 сек: потеря не более 60 сек работы. Для финансовых транзакций — checkpoint после каждого шага. Подробнее о метриках читайте в документации по RTO.
Пример конфигурации Kubernetes для failover:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-agent
spec:
replicas: 2
strategy:
type: RollingUpdate
template:
spec:
containers:
- name: agent
image: myregistry/ai-agent:latest
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 15
resources:
requests:
nvidia.com/gpu: 1
Что входит в работу
- Архитектурная схема failover (health check, orchestration, checkpointing)
- Реализация оркестратора и пула standby агентов
- Интеграция с очередью задач (Redis/Kafka) и Kubernetes/Docker
- Документация по эксплуатации (RTO/RPO, playbook)
- Тестирование сценариев отказа (crash, network partition, resource exhaustion)
- Поддержка 2 недели после внедрения
Как мы работаем
- Аналитика — изучаем текущую архитектуру агентов, определяем RTO/RPO, выбираем стратегию
- Проектирование — рисуем схему, согласуем health check endpoint и protobuf-контракты
- Реализация — пишем оркестратор, настраиваем warm standby, подключаем checkpointing
- Тестирование — симулируем отказы (Chaos Engineering), измеряем метрики failover
- Деплой — разворачиваем в staging, проводим нагрузочные тесты, передаём в production
Сроки и стоимость
Проект от 2 до 5 рабочих дней для одного AI-агента. Стоимость рассчитывается индивидуально — зависит от сложности модели, объёма контекста и требований к RTO/RPO. Оценим ваш проект за 2 дня — свяжитесь с нами для консультации. Опираясь на опыт 50+ реализованных систем отказоустойчивости, гарантируем корректную работу failover в условиях реальной нагрузки. Мы используем современный стек: Python asyncio, vLLM, Kubernetes, Apache Kafka. Закажите внедрение и получите надёжную защиту от простоев.







