AI-системы
LeadRadar
Пайплайн лидов из Threads, который переживает падение
- 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, но кэш наполняют все оценённые посты, а не только прошедшие.