Giống như rất nhiều câu hỏi về kiến trúc "bức tranh lớn", giải pháp tốt nhất thực sự là một trong những ... nó phụ thuộc. Bạn có thể kiểm soát môi trường triển khai không? Đó là ... bạn có thể sử dụng bất kỳ máy chủ e-mail nào bạn muốn hay bạn bị hạn chế sử dụng một máy chủ đã được cài đặt và lưu trữ? Bạn có thể chạy mã trên cùng một máy với dịch vụ SMTP không? Những câu hỏi này và nhiều câu hỏi khác nên được xem xét để đưa ra một kiến trúc (gần) tối ưu.
Vì vậy, tôi sẽ đưa ra một số giả định và đưa ra một số ý tưởng mà tôi nghĩ là đáng để khám phá ...
Bạn nên xem xét một hệ thống nhắn tin hiệu suất cao. Cụ thể, hãy xem RabbitMQ . RabbitMQ đáng tin cậy và hiệu quả, đồng thời việc phân phối khối lượng công việc dựa trên các sự kiện đến không đồng bộ là một mô hình mà họ thảo luận cụ thể trong các hướng dẫn (theo ý kiến của tôi là rất tốt).
Với một máy chủ nhắn tin như thế này, bạn có một quá trình nhận e-mail đến. Tốt hơn là điều này được thực hiện như một phần của quy trình SMTP, hoặc ít nhất là rất gần với nó - đặc biệt là với tải công việc mà bạn đã đề cập. Nếu bạn không còn lựa chọn nào khác, thì ý tưởng của bạn về việc sử dụng cron để thu thập tin nhắn qua POP hoặc IMAP sẽ phải hoạt động ngay từ bây giờ.
Quá trình thu thập e-mail sau đó sẽ đẩy các thư vào hàng đợi RabbitMQ. (Có lẽ không phải bản thân các e-mail theo nghĩa đen, mặc dù đó là một khả năng, nhưng tôi đã nghĩ giống như các tham chiếu đến nơi e-mail được lưu trữ một cách hiệu quả). Sau đó, bạn chạy nhiều quy trình công nhân được đăng ký vào một hàng đợi tin nhắn được đặt tên. Sau đó, RabbitMQ (hoặc bất kỳ dịch vụ nhắn tin nào mà bạn quyết định) sẽ phân phối những tin nhắn đó theo kiểu vòng tròn cho các thuê bao cá nhân. Nếu đã được tải, các quy trình công nhân có thể NACK thông báo, hoặc gửi thông báo luồng điều khiển của riêng chúng trở lại dịch vụ. Với khối lượng công việc RẤT cao (một lần nữa, giống như bạn đã đề xuất), tôi thực sự khuyên bạn nên sử dụng một số loại quy trình quản lý để theo dõi tình trạng tổng thể của hệ thống phân tán. Người quản lý sẽ thu thập số liệu thống kê về thời gian chạy (RẤT hữu ích cho việc lập kế hoạch tăng trưởng, tối ưu hóa và cấu trúc lại hệ thống tổng thể trong tương lai) và có khả năng xoay vòng và tắt các quy trình nhân viên mới. Trước khi bạn đạt được khối lượng công việc rất cao đó và giả sử rằng các quy trình công nhân của bạn ổn định và có thể tồn tại trong một thời gian dài mà không bị phân mảnh bộ nhớ, v.v., thì chỉ cần sử dụng máy chủ thông báo để phân phối công việc là đủ.
Đối với những gì nó đáng giá, tôi đã có một số kinh nghiệm về cách viết bộ xử lý e-mail (cụ thể là xmail - một cái mà tôi muốn giới thiệu nếu bạn mới bắt đầu dự án của mình và có nhiều quyền kiểm soát trong giai đoạn đầu của nó). Ngoài ra, tôi hiện đang sử dụng RabbitMQ để xây dựng hệ thống bộ nhớ đệm kết quả đa tác nhân cho một lưới điện toán khoa học lớn.
Dù sao thì ... chúc bạn may mắn với dự án của mình!