2016-11-14 132 views
2

我有一個關於如何減慢我的API請求的問題。對於我打的特定的第三方API,我允許每2秒發出3次請求。如果我翻過那個數字,我會返回status code 429以及以毫秒爲單位的等待時間。速率限制請求和亞馬遜SQS

這個API經常被調用,並且是我自己的服務器有傳入請求的直接結果,這些請求不受速率限制。

因爲我沒有任何需要同步處理第三方API請求,所以我決定將工作卸載到AWS上的彈性beanstalk工作箱,默認情況下從Amazon SQS讀取。

因此,如果狀態碼429從第三方api返回,我的工作人員會將SQS消息放回隊列中。當等待時間到時,這不可避免地使api呼叫工作。然而,這似乎是一個不好的解決方案

有什麼辦法告訴守護程序在工人箱上留在隊列中的消息分配的等待時間?或者我可以設置守護進程從隊列中讀取的速率?我正在尋找一種適當的方式(具體實現),以使用AWS上的工作者和隊列來限制速率。十分感謝你的幫助!

編輯: 我會假設有一些配置可以在AWS上進行修改來完成我所要求的功能,但無論哪種方式我都在尋找我所描述的設置的特定解決方案。我不太清楚如何修改或控制彈性beanstalk worker框中的守護進程。

+0

擊中第三方API的目的是什麼?調用它的觸發器是什麼? –

+0

我正在使用第三方電子郵件營銷服務來填充/更新客戶的電子郵件營銷帳戶。我的產品中有很多觸發器,主要用於實時更新和填充這些營銷帳戶。 – AIntel

回答

1

據我所知,你有一堆觸發器來調用第三方服務,你需要限制你的API調用。

最好的方法是限制從SQS讀取的守護進程。根據寫入守護程序的語言,您應該能夠輕鬆找到可以重用的速率限制器庫。例如,Java和Python分別具有經過良好測試的庫herehere

請記住,這些庫將允許每個工作者每秒發出X個請求。如果你有一個守護進程在運行,X將會是1.5,用於你的用例。如果你有兩個守護進程(例如,在兩臺不同的機器上各有一個守護進程),X應該是0.75

+0

這聽起來正是我所需要的。但我不確定如何修改Amazon在node.js工作者實例上運行的守護進程。你能否提供一些關於在彈性beanstalk工作者上實現這一點的更多細節? – AIntel

+0

我認爲這個問題已經在這裏得到了充分的回答 - 你要求一個高層次的設計,我想你已經在這裏了。我建議你提出另一個問題,詳細介紹你當前的設置。 –

+0

我添加了一個編輯以嘗試更清晰。我的確描述了我的設置,而你的回答大多隻是我最初發布的可能解決方案的重述。我的問題是如何實現這一點。感謝您的幫助! – AIntel

1

聽起來你從SQS隊列中獲取消息,並且在處理該消息的同時,發現你將無法現在完成處理,並且您希望在未來的某個已知時間之後放棄重試。

如果是這樣,那麼你可能想看看changing the message visibility時間。

當您從隊列中讀取消息時,它不會自動刪除。相反,如果您未在可見性超時範圍內刪除該消息,它將自動再次交付。這個想法是確保所有消息都被重試直到它們被刪除,但是在消費者有機會處理和刪除消息之前不會重試。該隊列具有默認的可見性超時,您可以基於每個消息進行覆蓋。

請注意,這種方法只會使您不會在超時之前從隊列中收到特定消息。如果您的客戶端進程繼續嘗試讀取消息,則會在此期間收到其他消息。如果不同的消息有不同的速率限制,這可能是你想要的。但是,如果沒有,您可能更願意讓客戶端線程休眠,直到達到限速等待時間。關於如何讓多個服務器上的多個線程停止工作,直到設定的時間點與AWS無關並且與您正在使用的語言高度相關的詳細信息。如果你決定走這條路線,你可能應該問一個單獨的問題。