2012-01-24 46 views
0

我創建了一個處理作業並構造「社交網絡」類型電子郵件的作業隊列模塊。 2進程包括:AWS SES向多個收件人發送郵件的速度太慢

  1. 構建定製的電子郵件(查看)例如User A and User B have commented on your postUser B and User C also likes User C's post。每個收件人都會收到其他電子郵件我最初創建了一個新的Swiftmailer實例並添加消息內容,主題和收件人。然後我將這些實例添加到數據庫中。

  2. cron作業運行後取回併發送這些電子郵件。

基準測試中,我意識到它每秒發送2封電子郵件。所以我嘗試在數據庫中存儲Swift_Message實例。沒有運氣,但仍需要很長時間。

目前,該代碼

  • 創建一個新的Swift_SmtpTransport
  • 創建新的Swift_Mailer實例。
    • 通過從數據庫檢索的Swift_Message消息的循環
    • 發送每封電子郵件。

但它仍然平均約爲2電子郵件第二。有什麼方法可以改進流程以加快交付速度?我使用Amazon SES作爲SMTP傳輸,我知道它至少可以處理每秒5封電子郵件。

所以這可能是我做錯了。任何想法讚賞。

編輯

請記住,這些消息對於每個收件人不同。我可以試用Swift_Decorator插件,但這意味着我將不得不改變視圖的生成方式。我只是在尋找其他方法來加速這個過程。

回答

2

我使用亞馬遜SES作爲我的SMTP傳輸

在我的經驗使用SES,我看到已經在半秒範圍最低 API響應時間,而平均徘徊大約一秒鐘。這不是對TCP/IP連接,可用帶寬等的限制,而是對每個連接的請求處理的。官方支持論壇上的其他人報告也一樣。 SMTP傳輸速度不會更快。

發送更快的唯一方法是並行發送。這是他們在官方支持論壇上推薦的方法。

只要您保持在「郵件每秒」配額下,SES API就允許多個同時連接。如果您不知道當前的每秒配額,請檢查您的發送統計信息。我不知道SMTP傳輸句柄超過了這個限制。

爲了並行發送更大量的郵件,我們修改了隊列處理器以便能夠並行運行。爲確保郵件永遠不會被髮送兩次,我們在表格中添加了一個「PID x抓取此」列並運行類似於UPDATE Queue SET selected_pid = ? WHERE target_ts < NOW() AND selected_pid IS NULL LIMIT X的查詢。然後,我們會尋找我們可以發送的郵件,將它們全部發送出去,然後再試一次,直到我們用完了那段時間內我們需要發送的郵件。

我們還修改了填充隊列的代碼,以確保隊列中永遠不會有比我們發送的郵件更多的郵件。我們能夠做到這一點,因爲我們批量發送郵件。當你經常收到郵件時,你很可能不需要跳過這個圈套。只要確保您的發送代碼知道如何正確響應各種過度配額錯誤。

作爲基於cron的隊列處理器的替代方案,請考慮使用Gearman來設置一組異步後臺作業人員來發送郵件。

相關問題