Progettare un sistema per inviare periodicamente e-mail a vari orari? [chiuso]

-3

Sto lavorando su una funzionalità che consentirà all'utente di configurare un'e-mail da inviare al momento che sceglie. Una volta che ha salvato questa configurazione, l'e-mail verrà consegnata al momento prescelto (o intorno a quel momento) ogni giorno fino a quando non disattiverà tale configurazione o la cancellerà. Ci possono essere molte di queste configurazioni con tempi diversi.

Finora stavo facendo qualcosa del genere:

  1. Esegui un cron job ogni 10 minuti.
  2. Cerca le configurazioni email che devono essere eseguite entro (ora - 10 minuti).
  3. Invia quelle email e aggiorna i log di stato.

Questo funzionava benissimo ma ha poche insidie.

  1. Le email configurate ai tempi di intersezione come 02:00 non sono state inviate a volte.

  2. A causa di una distribuzione o di un elevato utilizzo della CPU, il mais non è stato eseguito affatto.

In entrambi gli scenari sopra riportati, le email che non sono state selezionate non verranno raccolte nuovamente nelle prossime 24 ore.

Come dovrei andare avanti per progettare un sistema robusto che garantisca l'invio di tutte le email.

Se è importante, io sto usando Django e una macchina Linux.

    
posta priyankvex 03.08.2017 - 13:13
fonte

3 risposte

1

Puoi avere una coda di priorità con un flag di stato (inviato / non inviato) per ogni lavoro in coda.

Quando esegui il cron job, selezionerai dalla coda di priorità tanti elementi non inviati che dovrebbero essere inviati nei prossimi 10 minuti.

Quando viene inviata un'e-mail, si modifica lo stato non inviato in invio.

Potresti anche avere un qualche tipo di contatore per i tentativi, quindi se l'e-mail fallisce per es. 10 volte, non proverai più, ma eliminalo dalla coda.

La coda di priorità potrebbe essere ad es. una tabella in un database con indice sul tempo di invio e quindi si seleziona da esso utilizzando la clausola ORDER BY .

    
risposta data 03.08.2017 - 13:43
fonte
1

La soluzione standard per questo è di memorizzare la "data / ora del processo successivo" per ogni lavoro. Quindi, quando un utente crea un lavoro da eseguire alle 02:00, lo pianifichi per domani alle 02:00.

Quando viene eseguita l'attività cron (qualcosa come ogni 10-30 minuti), ottiene solo ogni * lavoro che ha un orario pianificato in passato. Una volta che un lavoro è stato elaborato, aggiorna il "prossimo tempo di processo" per quel lavoro a domani / settimana prossima / qualunque sia.

* Come per la risposta precedente, in genere è consigliabile decidere quanti e-mail inviare una sola corsa e processarne solo molti dal backlog. Devi assicurarti di non entrare in una situazione in cui il backlog non finisce mai però ...

    
risposta data 03.08.2017 - 14:50
fonte
0

Una soluzione semplice sarebbe semplicemente fare in modo che l'attività cron o l'applicazione scrivano l'ora dell'esecuzione riuscita più recente in un file.

Quindi al posto di ora - 10 minuti tra l'ultimo tempo di successo e ora (). Significa che non perderai mai un'email.

Una soluzione più complessa seppur approfondita sarebbe quella di memorizzare l'ultimo tempo di esecuzione riuscito nella pianificazione nel database e aggiornare quella colonna ogni volta che si invia un messaggio di posta elettronica.

Quindi si tratta solo di interrogare le e-mail che non sono state inviate.

    
risposta data 03.08.2017 - 14:47
fonte

Leggi altre domande sui tag