2017-01-23 85 views
1

我們的產品是我們需要擴展並使其成爲冗餘的其餘api。我們的計劃是使用nginx作爲負載平衡器和代理,它將api請求轉發到三個不同的服務器,所有這些服務器都將連接到同一個MongoDB副本集。Scaling REST API - 體系結構

我們的api具有基於用戶api密鑰的速率限制。用戶將擁有多個客戶端,並且所有客戶端都將使用相同的api密鑰簽署他們的請求。

我有這方面的兩個問題:

  1. 多cron作業必須對數據庫執行。 我們如何確保只有一臺服務器運行cron,但是如果服務器關閉了,另一臺運行它們呢?
  2. 我們如何執行所有服務器上組合的速率限制。 我們如何允許一個api密鑰在所有三臺 服務器上每天獲得1000個請求?

回答

0

需要針對數據庫執行多個cron作業。我們如何確保只有一臺服務器運行cron,但是如果該服務器關閉,另一臺服務器運行它們呢?

考慮使用隊列。所有的cron作業都可以從隊列中拾取。

我們應該如何實施所有服務器上的速率限制?我們如何讓一個api密鑰在所有三臺服務器上每天獲得1000個請求,其中包括 ?

考慮持續一個計數器,每當服務器收到來自租戶(帶有api密鑰的用戶)的請求時都會更新計數器。檢查計數器(計數器< 1000),當服務器收到請求時,看看他們是否已經消耗了配額。

+0

關於第2點的問題:如果每秒有多個請求會怎麼樣?你不能去數據庫一秒鐘更新計數器10次。 – giliev

+0

是的,但計數器更新可以是異步的(不要等待數據庫更新完成,寫入隊列並使用後臺作業處理隊列)來抵消任何性能影響。我們還可以考慮使用內存數據庫,因爲我們有其他功能可能需要更快的讀寫。 – Sumanth