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