К содержимому
Все кейсы

AI-системы

LeadRadar

Пайплайн лидов из Threads, который переживает падение

TypeScript (strict, ESM)BullMQ + RedisPlaywrightGoogle GeminigrammYpinozodRailway
2
очереди BullMQ
24 ч
TTL кэша оценок

Проблема

Скрапинг и скоринг ломаются по-разному: краш страницы Playwright не должен терять уже собранные посты, а разовый 429 от Gemini не должен убивать весь прогон. Наивный цикл теряет и то и другое.

Система

Две очереди BullMQ на Redis между стадиями. Скрапер (headless Chromium) держит низкую конкурентность — он упирается в браузер и I/O; скорер идёт с высокой — он в основном ждёт API. Каждая стадия ретраится независимо, с экспоненциальным backoff, и переживает рестарт процесса, потому что состояние в Redis, а не в памяти. Оценки кэшируются по sha256(текста поста) с TTL 24 часа: один и тот же пост, всплывший под несколькими ключевыми словами, стоит одного GET, а не второго платного вызова Gemini. Ниша не в коде — она в JSON-конфиге по пути из env, так что смена вертикали или запуск второго инстанса под другую нишу это конфиг, а не деплой.

Роль

Соло-разработка, включая решения по архитектуре очередей.

Результат

Задеплоено на Railway из Dockerfile поверх официального образа Playwright. Порог релевантности гейтит доставку в Telegram, но кэш наполняют все оценённые посты, а не только прошедшие.