Mysql
 sql >> Database >  >> RDS >> Mysql

Architettura di analisi ed elaborazione delle email

Come molte domande sull'architettura del "quadro generale", la soluzione migliore è davvero una di quelle ... dipende. Puoi controllare l'ambiente di distribuzione? Cioè... puoi usare qualsiasi server di posta elettronica che desideri o sei costretto a utilizzarne uno già installato e ospitato? È possibile eseguire codice sulla stessa macchina del servizio SMTP? Queste domande, e molte altre, dovrebbero essere considerate come un'architettura (quasi) ottimale.

Detto questo, farò un paio di ipotesi e offrirò alcune idee che penso valga la pena esplorare...

Dovresti esaminare un sistema di messaggistica ad alte prestazioni. In particolare, dai un'occhiata a RabbitMQ . RabbitMQ è affidabile ed efficiente e la distribuzione del carico di lavoro basata su eventi asincroni in entrata è un modello di cui discutono specificamente nei loro tutorial (a mio avviso molto buoni).

Con un server di messaggistica come questo, hai un processo che riceve l'e-mail in arrivo. Preferibilmente questo viene fatto come parte del processo SMTP, o almeno molto vicino ad esso, specialmente con il carico di lavoro che hai menzionato. Se non hai altra scelta, le tue idee sull'utilizzo di cron per raccogliere messaggi tramite POP o IMAP dovranno funzionare, per ora.

Il processo di raccolta della posta elettronica spingerebbe quindi i messaggi nella coda RabbitMQ. (Forse non letteralmente le e-mail stesse, anche se questa è una possibilità, ma stavo pensando più come riferimenti a dove l'e-mail è archiviata in modo efficiente). Quindi esegui più processi di lavoro che sono iscritti a una coda di messaggi denominata. RabbitMQ (o qualsiasi servizio di messaggistica tu scelga) distribuirà quindi quei messaggi in modo round robin ai singoli abbonati. Se già caricati, i processi di lavoro possono NACK il messaggio o inviare il proprio messaggio di flusso di controllo al servizio. Con un carico di lavoro MOLTO elevato (di nuovo, come hai proposto tu), consiglio vivamente una sorta di processo di gestione che tenga sotto controllo lo stato generale del sistema distribuito. Il manager raccoglierebbe statistiche sul tempo di esecuzione (MOLTO utile per la pianificazione della crescita futura, l'ottimizzazione e il refactoring dell'intero sistema) e avrebbe la capacità di avviare e arrestare nuovi processi di lavoro. Prima di arrivare a un carico di lavoro molto elevato e supponendo che i processi di lavoro siano stabili e possano vivere a lungo senza frammentazione della memoria, ecc., dovrebbe essere sufficiente utilizzare il server dei messaggi per distribuire il lavoro.

Per quel che può valere, ho avuto una certa esperienza nella scrittura di elaboratori di posta elettronica (in particolare xmail - uno che consiglierei se stai appena iniziando il tuo progetto e hai molto controllo sulle sue fasi iniziali). Inoltre, attualmente sto utilizzando RabbitMQ per creare un sistema di memorizzazione nella cache dei risultati multi-agente per un'importante griglia di calcolo scientifico.

Comunque... in bocca al lupo per il tuo progetto!