有些服務(wù)是限制QPS的,那么如何設(shè)計一個系統(tǒng)A,對系統(tǒng)A請求全部進入隊列,但是從隊列出隊保證是一定的QPS進行
這樣就不會導(dǎo)致被請求的系統(tǒng)因為QPS超出限制導(dǎo)致的拒絕服務(wù)
漏桶?
可以考慮 模仿redis-queue? 消費時按照nitron的做法 每次消費后sleep指定時間, 但是只能開單進程了, 這樣可以確保不超過最大qps, 入隊的時候 是不會影響的
@xcsoft 這個主意也不錯 簡單有效
也就是盡快出列,一秒內(nèi)出到10個任務(wù),那么開始等sleep(1秒 - 這秒內(nèi)最初那個出隊任務(wù)時間)時長,然后繼續(xù)下一個出隊
如果每秒不超過10任務(wù)則不進行sleep 你是這個意思吧
我寫了一個不知道對不對,用redis有序集合實現(xiàn)的
上代碼吧
/**
也不知道對不對呀,返回fasle直接把數(shù)據(jù)推回隊列,如果想保證數(shù)據(jù)順序處理 ,可以放入隊列的右邊進去,不知道對不對,別瞎用
其實我的想法稍微有點邪惡 因為很多api可以免費使用但是限制qps 所以要是能夠分到不同的賬戶上去調(diào)用 qps總量就上來了 redis通信本地還行 如果在遠端 自身延遲就有較大的影響了
我沒完全看懂你的算法 ,你只是嘗試將請求放到集合,如果重點考慮如何將內(nèi)容按照QPS取出是不是更好 類似漏桶算法 后面的可以不斷入隊 但是我取出的時候按照指定速率
你這個更像是如何入隊,而不是出隊
不建議這樣設(shè)計,原因如下:
如果限制出隊,那么入隊速率也應(yīng)該限制,因為隊列buffer是有上限的,消費跟不上生產(chǎn),直接會把隊列拉崩;
一般限流的服務(wù)接受方都會做限流響應(yīng),隊列根據(jù)對應(yīng)相應(yīng)拋回隊列做重試即可,或者拋入調(diào)度服務(wù)做延遲請求:如1小時內(nèi)只消費一次;
當然如果想要實現(xiàn)這樣的功能完全可以和限流一樣做,消費者使用令牌桶進行消費,沒有令牌了就拋回隊列,消費者前置一個調(diào)度就好了。
親 隊列的功能就是在消費者能力不足的情況下設(shè)計的 這是隊列存在的根本原因 條件1完全不成立
你視乎沒有理解我的業(yè)務(wù)需求,我是要實現(xiàn)定速出隊,而不是消費者能力有多強則取任務(wù)有多快