Хардкодинг PRO · Гайд №17

Надёжный ИИ-сервис

Как сделать так, чтобы задача не потерялась, сервер не лёг от второго пользователя, внешний AI мог ошибаться, а продукт всё равно доводил работу до результата.

Для новичковBackground jobsQueueПовторная попытка (Retry)IdempotencyRate limitsMonitoring
Надёжный AI сервис

Как читать этот гайд

Здесь нет задачи сделать из тебя backend-разработчика. ИИ сам напишет очередь, worker и retry. Тебе нужно понять где может сломаться пользовательский результат и что потребовать от ИИ.

ЧТО ЭТО ↓ ЗАЧЕМ ТЕБЕ ЭТО ↓ ЧТО ДЕЛАЕТ ИИ ↓ КАК ТЫ ПРОВЕРЯЕШЬ
1. Почему прямой запрос ломается 2. Задача, очередь и исполнитель 3. Путь задачи от клика до результата 4. Повторы и ограничения ожидания 5. Защита от дублей 6. Лимит запросов и 429 7. Мониторинг и восстановление 8. Как выбрать инструменты без оверинжиниринга 9. Надёжность и деньги 10. Готовые промпты 11. Непонятные слова 12. Финальная проверка 13. Домашка

1. Почему первый ИИ-сервис ломается

Почему ломается прямой запрос

Первый прототип почти всегда выглядит одинаково: пользователь нажал кнопку, backend отправил запрос в AI и просто ждёт ответа.

ПОЛЬЗОВАТЕЛЬ ↓ HTTP REQUEST ↓ AI API ↓ ЖДЁМ ↓ RESULT ↓ ОТВЕТ ПОЛЬЗОВАТЕЛЮ

На демо это кажется идеальным. В production начинается реальная жизнь.

Что может случиться:
вкладка закрылась; интернет пропал; AI отвечает две минуты; VPS перезапустился; внешний сервис вернул 429; процесс упал по памяти; пользователь нажал кнопку ещё раз.
Зачем тебе это знать?
Чтобы не принимать от ИИ архитектуру, которая работает только когда всё идеально.
Что делает ИИ: выносит долгую работу из пользовательского запроса и создаёт отдельную job.
Что проверяешь ты: может ли человек закрыть страницу, вернуться позже и всё равно получить результат.

2. Задача, очередь и исполнитель (Job / Queue / Worker)

Job Queue Worker
JobОдна конкретная задача: «сделать отчёт №123».
QueueОчередь задач, которые ждут обработки.
WorkerИсполнитель, который берёт job и выполняет её.
Зачем тебе?
Теперь жизнь задачи не зависит от одной открытой вкладки и одного длинного запроса.

Когда очередь НЕ нужна

Если операция выполняется быстро, почти никогда не падает и её легко повторить, добавлять Redis только ради модного слова «queue» не нужно.

Главный вопрос владельца: «Что произойдёт, если этот процесс оборвётся посередине?»

3. Как выглядит нормальный путь долгой задачи

Путь задачи
Пользователь нажал кнопку ↓ Backend создал JOB #123 ↓ Сохранил её ↓ Сразу вернул пользователю job_id ↓ Queue ↓ Worker ↓ AI / внешний API ↓ Результат сохранён ↓ Status = completed ↓ Пользователь увидел результат

Пользователь не обязан держать вкладку открытой, пока твой AI думает десять минут.

Зачем тебе это знать?
Чтобы у каждой долгой операции существовал понятный жизненный цикл, который можно проверить.
Что делает ИИ: создаёт таблицу jobs или настоящую queue, worker и механизм статусов.
Что проверяешь ты: есть ли у каждой задачи ID, статус и сохранённый финальный результат.

4. Повторы и ограничения ожидания

Повторная попытка (Retry) Лимит ожидания (Timeout) Увеличение паузы между попытками (Backoff)

Повторная попытка (Retry)

Повторная попытка (Retry), то есть повторная попытка после временной ошибки.

Лимит ожидания (Timeout)

Лимит ожидания (Timeout), то есть максимальное время ожидания. Система не должна висеть бесконечно.

Увеличение паузы между попытками (Backoff)

Увеличение паузы между попытками (Backoff) означает, что между повторными попытками мы делаем паузу, причём обычно всё большую.

Попытка 1 → FAIL ждём 2 сек ↓ Попытка 2 → FAIL ждём 4 сек ↓ Попытка 3 → FAIL ждём 8 сек ↓ FINAL FAIL или FALLBACK
Зачем тебе?
Мелкий сбой провайдера не должен сразу превращаться в потерянную задачу. Но бесконечный retry может сжечь деньги.
Нельзя повторять всё подряд. Неверный API key, validation error или неподдерживаемый файл сами по себе не исправятся от десятой попытки.

5. Защита от дублей (Idempotency): один запрос - один эффект

Idempotency

Idempotency — защита от того, чтобы одна и та же операция случайно выполнилась дважды.

Без неё возможны: две оплаты, две генерации за деньги, два заказа, два списания баланса, два письма.
Запрос: order=123 idempotency_key=ABC Первый раз: выполнили → сохранили result Повтор с тем же ABC: вернули старый result НО НЕ ЗАПУСТИЛИ ДЕЙСТВИЕ СНОВА
Зачем тебе это?
Повторная попытка (Retry) и нестабильная сеть могут сами создавать повторные запросы.
Как проверить: попросить ИИ отправить одну опасную операцию дважды и доказать, что платное действие произошло один раз.

6. Лимит запросов (Rate Limit) и ошибка 429

Rate Limit

Rate limit — ограничение количества запросов. AI-провайдер не бесконечный кран.

429 Too Many Requests означает: «ты отправляешь слишком много запросов».

Одновременные задачи (Concurrency)

Одновременные задачи (Concurrency) — сколько jobs выполняются одновременно.

100 jobs в Queue НЕ: 100 AI запросов одновременно А: concurrency = 5 ↓ 5 выполняются 95 ждут ↓ следующие заходят по мере освобождения
Зачем тебе?
Один очень активный клиент не должен съесть лимит провайдера для всех остальных.
Что делает ИИ: добавляет concurrency limit, per-user rate limit и обработку 429.

7. Мониторинг и восстановление задач

Monitoring

Наличие очереди ещё не означает, что система надёжная. Нужно видеть, что внутри неё происходит.

Queued jobsСколько задач ждёт.
Oldest job ageСколько ждёт самая старая.
Failed jobsСколько задач окончательно упали.
RetriesСколько повторных попыток происходит.
p95 processingЗа какое время укладываются 95% задач.
Provider errors429, 5xx, timeouts.

Проверка падением и перезапуском

Один из лучших тестов: запустить job, остановить worker посередине и снова запустить. Job не должна исчезнуть.

Главная проверка: «Если сервер перезапустится прямо сейчас, какие пользовательские задачи потеряются?» Ответ должен быть понятным.

8. Как выбрать технологию без оверинжиниринга

Не надо начинать с Redis, Kafka и Temporal только потому, что ты услышал слово «масштабирование».

Postgres jobsДля простого MVP часто достаточно.
PGMQQueue semantics прямо поверх Postgres.
Redis + BullMQХороший вариант для Node.js background jobs.
CeleryПопулярный вариант для Python.
QStash / SQSManaged queue, меньше своей инфраструктуры.
TemporalДля сложных многошаговых процессов.

Полезные ресурсы

Правило: сначала докажи, что простой вариант перестал справляться. Потом добавляй новый слой.

9. Надёжность напрямую влияет на деньги

Успешная AI-job может включать стоимость модели, storage, worker, базу, очередь и повторные попытки.

AI + storage + worker + queue + database + retries + fallback = реальная себестоимость результата
Опасный сценарий: AI уже выполнил дорогую генерацию, но ответ потерялся. Твой код решил, что задача упала, и запустил её второй раз.

Ограничения расходов

Что должен знать владелец: сколько стоит успешная задача и сколько стоит неудачная.

10. Что делает AI, а что остаётся на тебе

AI делаетQueue, worker, schema jobs, Redis/Postgres, retries, monitoring, tests, load test, deploy.
Ты решаешьМожно ли повторять операцию? Какой fallback допустим? Сколько ждать? Сколько можно потратить? Что увидит клиент?
Сильный навык вайбкодера: не писать worker руками, а спросить AI: «Что случится, если прямо здесь упадёт сервер?»

11. Готовые промпты

Это полноценные задания для ИИ-кодера. Они заставляют сначала диагностировать, потом проектировать, потом доказывать.

Промпт 1

Аудит надёжности ИИ-сервиса

Промпт 2

Нужна ли здесь очередь вообще?

Промпт 3

Спроектировать фоновую задачу

Промпт 4

Правильные правила повторных попыток

Промпт 5

Защита от двойного выполнения

Промпт 6

Лимит запросов и ошибка 429

Промпт 7

Резервный путь без скрытого ухудшения

Промпт 8

Проверка падения и перезапуска

Промпт 9

Мониторинг фоновых задач

Промпт 10

Безопасная проверка под нагрузкой

Промпт 11

Себестоимость одной задачи

Промпт 12

Финальная приёмка надёжности

12. Непонятные слова простыми словами 😄

ТерминПростыми словами
Background taskЗадача, которая выполняется в фоне, пока пользователь может закрыть страницу.
JobОдна конкретная задача, например «сгенерировать отчёт №123».
QueueОчередь задач, которые ждут обработки.
WorkerИсполнитель, который берёт job из очереди и выполняет её.
ProducerЧасть системы, которая создаёт новую job и кладёт её в очередь.
ConsumerПроцесс, который забирает job из очереди. Часто это worker.
Повторная попытка (Retry)Повтор операции после временной ошибки.
Увеличение паузы между попытками (Backoff)Увеличение паузы между повторными попытками.
Exponential backoffПауза растёт: например 2, 4, 8, 16 секунд.
JitterНебольшая случайность в паузе, чтобы все workers не повторили запрос одновременно.
FallbackЗапасной способ выполнить задачу, если основной недоступен.
Лимит ожидания (Timeout)Максимальное время, которое система готова ждать ответ.
Rate limitОграничение количества запросов за определённое время.
429HTTP-код «слишком много запросов».
Одновременные задачи (Concurrency)Сколько задач выполняется одновременно.
IdempotencyЗащита от двойного эффекта при повторном одинаковом запросе.
Idempotency keyКлюч, по которому система узнаёт повтор той же операции.
At-least-once deliveryОчередь гарантирует доставку хотя бы раз, но иногда возможны повторы.
Visibility timeoutПериод, когда job временно скрыта от других workers после взятия в работу.
Dead Letter QueueОтдельное место для задач, которые окончательно не удалось обработать.
BacklogНакопившийся хвост jobs.
Queue ageСколько времени самая старая job ждёт выполнения.
CronЗапуск задач по расписанию.
SchedulerМеханизм планирования будущих задач.
CacheБыстрое временное хранилище повторно используемых данных.
RedisБыстрое in-memory хранилище, часто используется для очередей и cache.
PostgreSQLРеляционная база данных; в небольших системах может хранить и jobs.
PGMQОчередь сообщений поверх PostgreSQL.
BullMQПопулярная очередь для Node.js поверх Redis.
CeleryПопулярная система фоновых задач для Python.
QStashManaged-сервис фоновых HTTP-задач и расписаний.
SQSManaged-очередь сообщений AWS.
TemporalСистема для долгих, многошаговых и восстанавливаемых workflow.
Durable executionВыполнение, которое умеет продолжаться после сбоев.
WebhookHTTP-уведомление от одного сервиса другому.
p9595% задач выполняются быстрее этого времени.
MonitoringНаблюдение за состоянием системы.
AlertАвтоматическое уведомление о проблеме.
Graceful degradationУпрощённый режим работы вместо полного падения.
Circuit breakerВременная остановка запросов в сервис, который массово падает.

13. Финальная проверка перед рабочим запуском

Нажимай на строку или на галочку. Отметка меняется сразу даже в просмотрщике без JavaScript. Если JavaScript доступен, прогресс ещё и сохраняется на устройстве.

0 / 25
Все 25 пунктов отмечены. Чек-лист пройден.

14. Домашка: сломай свой сервис сам

Финальная проверка

Возьми одну настоящую долгую или платную функцию своего проекта:

AI-генерация или обработка файла или создание отчёта или парсинг или долгий анализ данных
  1. Нарисуй путь от клика до результата.
  2. Реши вместе с AI, нужна ли очередь.
  3. Добавь job_id и статусы.
  4. Настрой timeout и ограниченный retry.
  5. Защити от дублей.
  6. Останови worker посреди тестовой задачи.
  7. Запусти снова и докажи восстановление.
  8. Создай 10–50 mock jobs и посмотри на backlog.
  9. Посчитай себестоимость.
Что принести на разбор: схема, job status, доказательство retry, доказательство crash recovery, duplicate test и одна метрика очереди.

Главная мысль

Надёжность — не Redis и не модная архитектура.

Это способность системы довести обещанную пользователю работу до понятного финала, даже когда отдельные части ошибаются.

ЗАДАЧУ ПРИНЯЛИ ↓ СОХРАНИЛИ ↓ КОНТРОЛИРУЕМ НАГРУЗКУ ↓ ПОВТОРЯЕМ ВРЕМЕННЫЕ ОШИБКИ ↓ НЕ СОЗДАЁМ ДУБЛИ ↓ ПЕРЕЖИВАЕМ RESTART ↓ СОХРАНЯЕМ RESULT ↓ СООБЩАЕМ ПОЛЬЗОВАТЕЛЮ ↓ НАБЛЮДАЕМ И СЧИТАЕМ ДЕНЬГИ

Следующий гайд №17: автономные ИИ-агенты, инструменты, MCP, саб-агенты, оркестрация и подтверждение человеком.

Перед переходом дальше: Если триггера роста ещё нет, не усложняй проект. Ты должен понять принцип сейчас, а внедрение можно отложить. Кнопка «Дальше» означает следующий учебный урок, а не обязанность внедрить каждую технологию.
Открыть финальную проверку →
🧠 WIKI ЭТОГО ГАЙДА

Непонятные слова простыми словами

Не зубри определения. Вернись сюда, если встретил термин и забыл, что он означает.

JobОтдельная задача, которую сервис должен выполнить.
QueueОчередь задач, ожидающих выполнения.
WorkerПроцесс, который берёт задачи из очереди и выполняет их.
RetryПовтор временно неудачной операции.
TimeoutМаксимальное время ожидания операции.
BackoffУвеличение паузы между повторными попытками.
IdempotencyЗащита от двойного эффекта при повторе одного запроса.
ConcurrencyСколько задач система выполняет одновременно.