@Fragman

Как решается проблема запуска по расписанию с нескольких реплик?

Есть процесс, который создает запись в базе данных по расписанию(например в 10 утра каждый день или каждую секунду, cron по сути). Этот процесс деплоится на несколько реплик, соотвественно каждая из них будет создавать запись, но создать в итоге нужно только одну запись. Какие есть способы решения этой проблемы? Процессы друг о друге ничего не знают.
  • Вопрос задан
  • 65 просмотров
Решения вопроса 2
Варианты следующие - процесс работающий по расписанию выделить в отдельный сервис-воркер и запускать лишь в единственном экземпляре, возможно используя планировщик задач.
Ну или сделать так чтобы реплики знали друг о друге и единовременно регулярную задачу выполняла только одна, например используя redis в качестве распределенного лока, или raft, или consul, или zookeeper и т.п..
Ответ написан
Комментировать
hint000
@hint000
у админа три руки
Если в силу каких-то обстоятельств непреодолимой силы окажется невозможно изменение архитектуры, которое (вполне здравомысленно) предложил Дмитрий Шицков, то могу предложить костыль. Каждая реплика перед созданием записи делает паузу на random(0..10.0) секунд, потом делает запрос, нет ли уже такой записи, если нет, то создаёт.
В случае ежесекундных записей пауза может быть на random(0..1000) миллисекунд.
Так-то можно и без рандомной паузы, транзакции знают своё дело и одна из реплик в любом случае окажется первой. Просто мы хотим чуток размазать всплески нагрузки (а вдруг у нас тысячи или миллионы реплик?)

Подчеркну: костыль - это лишь костыль. Не следует его воспринимать как нормальное решение.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы