Django приложение с несколькими экземплярами - как обеспечить ежедневную отправку электронной почты только один раз? - PullRequest
2 голосов
/ 03 февраля 2020

Я создаю Django приложение, которое использует APScheduler для отправки ежедневного электронного письма в назначенное время каждый день. Недавно было принято решение увеличить количество экземпляров до двух, чтобы в случае сбоя одного из экземпляров что-то всегда работало. Проблема, с которой я сейчас сталкиваюсь, заключается в том, как предотвратить отправку ежедневных электронных писем обоими экземплярами. Я рассмотрел возможность установки какого-либо флага в базе данных (Postgres), чтобы другой экземпляр знал, что не нужно отправлять, но я думаю, что этот метод создаст условия гонки - первый экземпляр не установит флаг вовремя для второго экземпляра, чтобы увидеть или какой-то похожий сценарий. Кто-нибудь сталкивался с этой проблемой и как вы ее решили?

РЕДАКТИРОВАТЬ:

def start(): scheduler = BackgroundScheduler() scheduler.add_job(send_daily_emails, 'cron', hour=11) scheduler.start()

Так что это запускается, когда мое приложение инициализируется - это создает фоновый планировщик, который запускает функцию send_daily_emails в 11 утра каждое утро. Функция send_daily_emails это именно то, что она делает - отправляет пару писем. Моя проблема заключается в том, что если запущено два экземпляра приложения, будут созданы два отдельных фоновых планировщика, и, таким образом, электронные письма будут отправляться два раза в день, а не один раз.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Вы можете использовать предложенное решение для базы данных с select_for_update

0 голосов
/ 04 февраля 2020

Если вы используете сельдерей, почему бы не использовать сельдерея + + 1002 * -целери-удара?

...