我正在嘗試傳播爆發中收到的數據。這意味着我有一些其他應用程序以大型突發接收的數據。對於每個數據條目,我需要在某些服務器上執行一些額外的請求,在這些服務器上我應該限制流量。因此,我嘗試在我擁有的時間內分發請求,直到下一個數據突發到達。從爆發中傳播數據
當前我正在使用token-bucket來分散數據。但是,由於我收到的數據已經很糟糕,我仍然要麼填滿待決請求的隊列,要麼每當有突發事件發生時我都會出現尖峯。所以這個算法似乎沒有做到我需要的那種整形。
有什麼其他算法可用來限制請求?我知道我有高負載和低負載的時間,所以兩者都應該通過應用程序來處理。
我不確定我是否真的能夠解釋我目前遇到的問題。如果您需要任何澄清,請讓我知道。
編輯:
我會盡力澄清問題多一些解釋,爲什麼一個簡單的速率限制不起作用。
問題在於流量的突然性和事實,即突發在不同時間有不同的大小。幾乎不變的是每次爆發之間的延遲。因此,我們得到一堆用於處理的數據記錄,並且我們需要儘可能均勻地分散出來,然後再進入下一羣。但是,我們並不是100%確定下一羣將進入什麼時候,只是大概地,所以一個簡單的divide time by number of records
不應該像它應該那樣工作。
速率限制不起作用,因爲數據的擴散不足以這種方式。如果我們接近飽和的速度,一切都很好,我們均勻分散(儘管這不應該頻繁發生)。如果我們低於門檻,傳播會變得更糟糕。
我做出了榜樣,使這個問題更加清晰:
比方說,我們限制我們的流量每秒10個請求和新數據來自於每10秒左右。
當我們在一個時間範圍的開始獲得100條記錄時,我們將每秒查詢10條記錄,並且我們有一個完美的均勻傳播。但是,如果我們只有15條記錄,我們將在其中查詢10條記錄,其中我們查詢5條記錄的時間爲1秒,查詢0條記錄的時間爲8秒,所以隨着時間的推移,我們有非常不同的流量級別。相反,如果我們每秒只查詢1.5條記錄會更好。然而,設置這個速度也會產生問題,因爲新的數據可能會更早到達,所以我們沒有足夠的10秒鐘,1.5個查詢是不夠的。如果我們使用令牌桶,問題實際上會變得更糟,因爲令牌桶允許突發在時間框架開始時通過。
但是這個例子過於簡化,因爲實際上我們無法在任何給定的時刻完全知道未決請求的數量,而只是一個上限。所以我們必須根據這個數字來節制每一次。
這與我目前使用的想法非常接近。只需將請求數除以估計的每次爆發時間。我的計算表明,如果突發事件發生,我們將處理2/3的數據,這是可以接受的。我也會看看我這個詞的工作方式,所以也許我們甚至可以拿到最後的1/3。 – LiKao