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

定速出隊,需要個建議

forgaoqiang

有些服務(wù)是限制QPS的,那么如何設(shè)計一個系統(tǒng)A,對系統(tǒng)A請求全部進入隊列,但是從隊列出隊保證是一定的QPS進行

這樣就不會導(dǎo)致被請求的系統(tǒng)因為QPS超出限制導(dǎo)致的拒絕服務(wù)

1848 5 0
5個回答

xcsoft

漏桶?

  • forgaoqiang 2022-05-27

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

  • xcsoft 2022-05-27

    可以考慮 模仿redis-queue? 消費時按照nitron的做法 每次消費后sleep指定時間, 但是只能開單進程了, 這樣可以確保不超過最大qps, 入隊的時候 是不會影響的

  • forgaoqiang 2022-05-29

    @xcsoft 這個主意也不錯 簡單有效
    也就是盡快出列,一秒內(nèi)出到10個任務(wù),那么開始等sleep(1秒 - 這秒內(nèi)最初那個出隊任務(wù)時間)時長,然后繼續(xù)下一個出隊
    如果每秒不超過10任務(wù)則不進行sleep 你是這個意思吧

nitron

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

  • forgaoqiang 2022-05-27

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

  • nitron 2022-05-27

    不影響push啊,只是pop出來的時候進行sleep,這樣間接達到減慢pop速率的效果

  • 2548a 2022-05-27

    影響了,workerman不能用sleep的,用了之后進程會卡住處理不了任何東西的

  • nitron 2022-05-27

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

  • forgaoqiang 2022-05-29

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

tanhongbin

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

  • forgaoqiang 2022-05-27

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

  • tanhongbin 2022-05-27

    上代碼吧
    /**

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

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

  • forgaoqiang 2022-05-27

    其實我的想法稍微有點邪惡 因為很多api可以免費使用但是限制qps 所以要是能夠分到不同的賬戶上去調(diào)用 qps總量就上來了 redis通信本地還行 如果在遠端 自身延遲就有較大的影響了

    我沒完全看懂你的算法 ,你只是嘗試將請求放到集合,如果重點考慮如何將內(nèi)容按照QPS取出是不是更好 類似漏桶算法 后面的可以不斷入隊 但是我取出的時候按照指定速率
    你這個更像是如何入隊,而不是出隊

chaz6chez

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

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

  2. 一般限流的服務(wù)接受方都會做限流響應(yīng),隊列根據(jù)對應(yīng)相應(yīng)拋回隊列做重試即可,或者拋入調(diào)度服務(wù)做延遲請求:如1小時內(nèi)只消費一次;

當然如果想要實現(xiàn)這樣的功能完全可以和限流一樣做,消費者使用令牌桶進行消費,沒有令牌了就拋回隊列,消費者前置一個調(diào)度就好了。

  • forgaoqiang 2022-05-29

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

  • chaz6chez 2022-05-30

    隊列是為了異步任務(wù),而不是消費能力不強,你說的業(yè)務(wù)場景是任務(wù)調(diào)度服務(wù)干的事兒

胡桃

滑動時間窗口算法

  • forgaoqiang 2022-05-29

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

  • 胡桃 2022-05-30

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

年代過于久遠,無法發(fā)表回答
??