TGViewer
Node.js Backend | YeaHub Node.js Backend | YeaHub @yeahub_node_backend · 465 subscribers
Post #452 195
⏱️ CRON при репликации сервиса: когда он внезапно запускается дважды

Когда у тебя один инстанс сервиса — cron-задачи живут спокойной жизнью: раз в минуту/час/день отработали — и всё
Но как только появляется горизонтальное масштабирование, начинается цирк: один и тот же cron внезапно запускается на всех репликах

Результат — задвоение задач, дубль-отправки в очередь, лишние запросы в БД, гонки, broken idempotency.
Разбираемся, как это контролировать

🙃 Способы синхронизации CRON между репликами

1) Distributed lock (рекомендуется)

Ты заранее пытаешься взять “маркер лидерства”
Кто взял — тот и выполняет cron. Остальные ждут

Варианты реализации:
— Redis + Redlock
Стандарт: быстрая блокировка с TTL → если под умер, блокировка сама освободится

— PostgreSQL advisory locks
SELECT pg_try_advisory_lock(12345)
Если вернул true, ты — лидер

— PostgreSQL row-level / table-level locks
Простой механизм: лочишь строку “task_name = cleanup_daily”


2) Leader election (лидер выбирается автоматически)

Идея: из всех реплик выбирается одна основная, она и запускает cron.

Варианты:
— Kubernetes leader election через Lease API
Удобно для Cron внутри подов

— Consul / Etcd лидер-электоры
Более enterprise-решение.

3) Cron вынести наружу (лучший вариант для сложных систем)

Перенести все периодические задачи в:
— Kubernetes CronJob
Самый распространённый вариант.
— Airflow / Temporal / BullMQ Scheduler
Если задач много и они взаимосвязаны.
— Dedicated scheduler service

Минус: иногда оверхед для небольших проектов

4) Idempotency + мягкая синхронизация

Если не можешь/не хочешь бороться с параллельностью —
просто проектируешь cron так, чтобы дубликат не ломал логику

Подходы:
— В БД держать processed_at, а cron проверяет “ещё не обработано?”.
— Все действия писать через UPSERT / ON CONFLICT DO NOTHING.
— Слать команды в очередь, где есть idempotency-key.


🚀 Пост Guru Node.js: @DemetraIT
  • ❤ 1
More from @yeahub_node_backend
  1. Oct 9, 2026#book #начинающие 📚 Node.js: разработка приложений в микросервисной архитектуре с нуля Ос…
  2. Oct 8, 2026#Собес #volume #bind #mount 🤔 Как считать данные, записанные контейнером? 💬 Кратко: Данн…
  3. Oct 7, 2026#Собес #event_loop #main_thread #blocking 🤔 Заблокирует ли бесконечный цикл взаимодействи…
  4. Oct 5, 2026#Собес #event_loop #asynchronous #nodejs 🤔 Что такое process.nextTick() 💬 Кратко: proces…
  5. Oct 2, 2026#podcast #все 📚 Kolesa Podcast Podcast by IT-компания Kolesa Group. В целом он обо всём и…
  6. Oct 1, 2026#Собес #date #timestamp #interval 🤔 Как работать с датами и временными интервалами в SQL?…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →