国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

定速出隊(duì),需要個(gè)建議

forgaoqiang

有些服務(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ù)

1809 5 0
5個(gè)回答

xcsoft

漏桶?

  • forgaoqiang 2022-05-27

    leak bucket 是不錯(cuò)的算法 問(wèn)題是如何用PHP具體實(shí)現(xiàn)有什么建議和參考么

  • xcsoft 2022-05-27

    可以考慮 模仿redis-queue? 消費(fèi)時(shí)按照nitron的做法 每次消費(fèi)后sleep指定時(shí)間, 但是只能開(kāi)單進(jìn)程了, 這樣可以確保不超過(guò)最大qps, 入隊(duì)的時(shí)候 是不會(huì)影響的

  • forgaoqiang 2022-05-29

    @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è)意思吧

nitron

簡(jiǎn)單實(shí)現(xiàn)就是consume時(shí)先sleep一哈?
不精確但至少不會(huì)超越最大QPS

  • forgaoqiang 2022-05-27

    問(wèn)題在于 sleep的時(shí)候有入隊(duì)的如何處理 理想狀態(tài)是實(shí)現(xiàn) 每秒出出多少個(gè)

  • nitron 2022-05-27

    不影響push啊,只是pop出來(lái)的時(shí)候進(jìn)行sleep,這樣間接達(dá)到減慢pop速率的效果

  • 2548a 2022-05-27

    影響了,workerman不能用sleep的,用了之后進(jìn)程會(huì)卡住處理不了任何東西的

  • nitron 2022-05-27

    嗷對(duì),忘了這茬了
    那計(jì)算數(shù)量發(fā)延遲隊(duì)列

  • forgaoqiang 2022-05-29

    @2548a @nitron 如果這個(gè)進(jìn)程的主要任務(wù)就是將任務(wù)出列發(fā)送出去然后異步處理請(qǐng)求的回調(diào) 是不是就不是問(wèn)題

tanhongbin

我寫了一個(gè)不知道對(duì)不對(duì),用redis有序集合實(shí)現(xiàn)的

  • forgaoqiang 2022-05-27

    愿聞其詳,也是一個(gè)辦法,我也想著配合redis的隊(duì)列和集合實(shí)現(xiàn),流控是關(guān)鍵,如何實(shí)現(xiàn)指定的QPS

  • tanhongbin 2022-05-27

    上代碼吧
    /**

    • @Describe: 限制速率接口 利用redis有序集合
    • @param string $name 集合名稱
    • @param int $time 時(shí)間 例如60秒內(nèi)
    • @param string $count time 時(shí)間內(nèi)限制的次數(shù)
    • @return bool
    • @Datetime: 2022-03-31 9:59
    • @Username: thb
      /
      static public function rate($name,$time,$count)
      {
      //獲取當(dāng)前時(shí)間 微秒 1648691146.836558
      $new_time = self::msectime();
      //限制開(kāi)始時(shí)間
      $start_time = $new_time - $time
      1000;
      //限制時(shí)間內(nèi)的成員數(shù)量
      $rate_count = Redis::zCount('sms:redis_queue:'.$name,$start_time,$new_time);
      //大于等于成員數(shù)量 返回fasle
      if($rate_count >= $count){
      //刪除限制開(kāi)始時(shí)間之前的請(qǐng)求
      Redis::zRemRangeByScore('sms:redis_queue:' . $name,0,$start_time-1);
      return false;
      }
      //將本次成員添加進(jìn)入集合
      Redis::zAdd('sms:redis_queue:' . $name, $new_time,randstr(4));
      return true;
      }
      //返回當(dāng)前13位時(shí)間戳
      static public function msectime() {
      list($msec, $sec) = explode(' ', microtime());
      return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
      }

    也不知道對(duì)不對(duì)呀,返回fasle直接把數(shù)據(jù)推回隊(duì)列,如果想保證數(shù)據(jù)順序處理 ,可以放入隊(duì)列的右邊進(jìn)去,不知道對(duì)不對(duì),別瞎用

  • forgaoqiang 2022-05-27

    其實(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ì)

chaz6chez

不建議這樣設(shè)計(jì),原因如下:

  1. 如果限制出隊(duì),那么入隊(duì)速率也應(yīng)該限制,因?yàn)殛?duì)列buffer是有上限的,消費(fèi)跟不上生產(chǎn),直接會(huì)把隊(duì)列拉崩;

  2. 一般限流的服務(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)度就好了。

  • forgaoqiang 2022-05-29

    親 隊(duì)列的功能就是在消費(fèi)者能力不足的情況下設(shè)計(jì)的 這是隊(duì)列存在的根本原因 條件1完全不成立
    你視乎沒(méi)有理解我的業(yè)務(wù)需求,我是要實(shí)現(xiàn)定速出隊(duì),而不是消費(fèi)者能力有多強(qiáng)則取任務(wù)有多快

  • chaz6chez 2022-05-30

    隊(duì)列是為了異步任務(wù),而不是消費(fèi)能力不強(qiáng),你說(shuō)的業(yè)務(wù)場(chǎng)景是任務(wù)調(diào)度服務(wù)干的事兒

胡桃

滑動(dòng)時(shí)間窗口算法

  • forgaoqiang 2022-05-29

    嗯 是的 我就是要實(shí)現(xiàn)這個(gè)效果 有什么好的php參考么 特別是能和workerman配合的

  • 胡桃 2022-05-30

    這種東西網(wǎng)上一大把,知曉原理很容易實(shí)現(xiàn),基于 redis sorted set 可實(shí)現(xiàn)限速,追求性能用共享內(nèi)存,隊(duì)列就更不用我說(shuō)了。建議就是這么多,現(xiàn)成的代碼我就沒(méi)有了。

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??