2013-02-27 13 views
2

我們使用SES API向Amazon SES發送消息。我們的發送速率現在是每秒90條消息。但是即使我們沒有達到這個極限,我們也會得到throttling exception,只是試圖接近它。由於節流錯誤無法達到Amazon SES發送限制

現在我們可以穩定地發送每秒30條消息的速率。問題是如何發送更快。

讓我深入一些細節並澄清問題。

  • 單個API發送請求可能需要0.3到3秒才能完成。這就是爲什麼如果我們要按順序發送消息,我們很難每秒鐘收到1條消息。
  • 幸運的是,我們可以並行發送消息,這就是我們正在做的。
  • 對於每個線程,我們檢查它不會每秒發送更多的允許消息數。例如,如果我們有40個線程,那麼我們不允許每個線程每秒發送2個以上的消息。是的,這不是最佳的。
  • 我們註冊每個消息發送和API請求完成的時間(當我們從API獲得響應時)。這可以獲得一些統計信息。
  • 當我們限制發送限制小於允許限制(如60而不是90)時,一切正常。
  • 當我們嘗試發送最大限制時,我們開始出現限制錯誤。就像每秒達到80次請求的速度一樣,我們開始收到異常。

這讓我提出的問題:

問:如何發送與允許的最高速度的消息?

讓我們從另一個問題開始 - 'SES如何計算檢查發送速率的消息數?'

讓我猜。當我們提交新請求時,他們會查看當前時刻上一秒內提交的請求數量,如果此數量少於我們的限制,則接受請求。

但是等等。如果我們有40個線程,每個線程每秒不能發送超過2條消息,那麼我們永遠無法達到極限。但是我們確實得到了例外。

研究

有亞馬遜SES博客有關操作的限制很大blog post。我們正在嘗試採用這種方法,但尚未成功。

我們在我們的應用程序和PHP SES SDK中使用PHP。

我想這是相當普遍的任務,但由於某種原因,我不幸找到完整的解決方案。


任何幫助或想法將不勝感激。謝謝。

回答

1

關鍵帶走的是:

多種因素會影響你的發送速率,例如消息大小, 網絡性能或Amazon SES可用性。

根據您所說的,您似乎使用了一點模糊邏輯來嘗試計算您要發送的郵件數量。這不是完美的,所以如果你的AWS限制是90p/s,那麼設置你的代碼更低,e/g到60p/s是有意義的(再一次,這一切取決於你的估計的準確度)。

您應該考慮其他方法,如您提到的方法,例如您提供的鏈接中所述的「指數回退」。

你可以考慮的另一件事是利用隊列,如SQS。通過這種方式,您可以儘快地從列表中選擇任務,如果速度太快,您可以始終退出,然後儘快跳回隊列。

+0

我們使用PHP SES SDK進行批量發送。在發生節流或其他錯誤的情況下,SDK會爲我們提供支持。我們已經發現了批量線程和消息數量的最佳配置,對我們來說工作正常。儘管我們並沒有以儘可能高的速度發送,但畢竟我們對我們所擁有的東西沒有問題。我們使用的是Gearman而不是SQS,負責發送消息的腳本除了發送外什麼也不做。我認爲這是你的建議。感謝您的評論。 – 2013-10-30 07:45:23

+0

如果您滿意我的答案作爲解決方案,隨時將其標記爲正確答案。 – 2013-12-07 06:13:28

相關問題