Podobnie jak w przypadku wielu pytań o architekturę z dużym obrazem, najlepszym rozwiązaniem jest naprawdę jedno z nich... to zależy. Czy możesz kontrolować środowisko wdrażania? To znaczy... czy możesz użyć dowolnego serwera poczty e-mail, czy jesteś ograniczony do korzystania z takiego, który jest już zainstalowany i hostowany? Czy możesz uruchomić kod na tej samej maszynie co usługa SMTP? Te pytania i wiele innych należy rozważyć, aby opracować (prawie) optymalną architekturę.
Biorąc to pod uwagę, zamierzam przyjąć kilka założeń i przedstawić kilka pomysłów, które moim zdaniem są warte zbadania...
Powinieneś przyjrzeć się wysokowydajnemu systemowi przesyłania wiadomości. W szczególności spójrz na RabbitMQ . RabbitMQ jest niezawodny i wydajny, a dystrybucja obciążenia oparta na asynchronicznych zdarzeniach przychodzących jest wzorcem, który szczegółowo omawiają w swoich (moim zdaniem bardzo dobrych) tutorialach.
Z takim serwerem wiadomości, masz jeden proces, który odbiera przychodzącą pocztę e-mail. Najlepiej, gdy jest to wykonywane jako część procesu SMTP, a przynajmniej bardzo blisko niego – zwłaszcza w przypadku obciążenia pracą, o którym wspomniałeś. Jeśli nie masz innego wyjścia, Twoje pomysły dotyczące używania crona do zbierania wiadomości przez POP lub IMAP będą musiały na razie zadziałać.
Proces zbierania wiadomości e-mail będzie następnie wpychał wiadomości do kolejki RabbitMQ. (Może nie dosłownie same e-maile, chociaż jest to możliwe, ale myślałem raczej o odniesieniach do miejsca, w którym e-mail jest efektywnie przechowywany). Następnie uruchamiasz wiele procesów roboczych, które są subskrybowane do nazwanej kolejki komunikatów. RabbitMQ (lub jakakolwiek usługa przesyłania wiadomości, na którą się zdecydujesz) będzie następnie dystrybuować te wiadomości w sposób okrężny do poszczególnych subskrybentów. Jeśli są już załadowane, procesy robocze mogą NACK wiadomości lub wysłać własny komunikat przepływu sterowania z powrotem do usługi. Przy BARDZO dużym obciążeniu (znowu, tak jak zaproponowałeś), gorąco polecam jakiś rodzaj procesu zarządzania, który pozwala na kontrolowanie ogólnej kondycji systemu rozproszonego. Kierownik zbierałby statystyki czasu wykonywania (BARDZO przydatne do przyszłego planowania rozwoju, optymalizacji i refaktoryzacji całego systemu) i miałby możliwość uruchamiania i zamykania nowych procesów roboczych. Zanim dojdziesz do tego bardzo dużego obciążenia i zakładając, że Twoje procesy robocze są stabilne i mogą działać przez długi czas bez fragmentacji pamięci itp., wystarczy użyć serwera wiadomości do dystrybucji pracy.
Co jest warte, mam pewne doświadczenie w pisaniu procesorów poczty e-mail (w szczególności xmail - taki, który polecam, jeśli dopiero zaczynasz swój projekt i masz dużą kontrolę nad jego wczesnymi etapami). Ponadto obecnie używam RabbitMQ do budowy wieloagentowego systemu buforowania wyników dla dużej naukowej sieci obliczeniowej.
W każdym razie... powodzenia w Twoim projekcie!