• 注册
  • 关于作者
    个人说明:他太懒了,什么都没有写
    关注 0 粉丝 0 喜欢 0 内容 238
    雅安
    聊天 送礼
    • 查看作者
    • round robin权重轮循算法实现

      先上代码,采用php脚本语言

      <?php
      
      /* 
       * Copyright (C) FatHong
       */
      
      /* 数据初始化,weight: 权重 */
      $hosts['a'] = array('weight' => 5, 'current_weight' => 0, 'count' => 0);
      $hosts['b'] = array('weight' => 3, 'current_weight' => 0, 'count' => 0);
      $hosts['c'] = array('weight' => 2, 'current_weight' => 0, 'count' => 0);
      
      $result = array();
      
      /* 模拟10次 */
      for ($i = 0; $i < 10; $i++) {
          round_robin($hosts, $result);
      }
      
      /* 输出结果 */
      print_r($result);
      
      /* round robin 轮循 */
      function round_robin(&$hosts, &$result)
      {
          $total = 0;
          $best = null;
      
          foreach ($hosts as $key => $item) {
              $current = &$hosts[$key];
              $weight = $current['weight'];
      
              $current['current_weight'] += $weight;
              $total += $weight;
      
              if ( ($best == null) || ($hosts[$best]['current_weight'] < 
                                      $current['current_weight']) ) 
              {
                  $best = $key;
              }
          }
      
          $hosts[$best]['current_weight'] -= $total;
          $hosts[$best]['count']++;
      
          $result[] = $best;
      }

      输出结果:

      Array
      (
          [0] => a
          [1] => b
          [2] => c
          [3] => a
          [4] => a
          [5] => b
          [6] => a
          [7] => c
          [8] => b
          [9] => a
      )

      负载均衡的服务器中,其实现算法有种是round-robin权重轮循,就是后端的服务器列表中,给每个服务器标上权重,代表它被采用的机率。

      这段代码把最简洁的流程剥离出来,没考虑后端挂起等情况,可以知道它是怎么实现的,仅供参考。

      php curl高效获取网页内容(IPV6下超时的解决办法)

      PHP

      -----------------------------------------------

      小编hx注解:

      附执行时,每个key的变化,就比较好理解了。

      每次执行时current_weight加上weight,如果当前current_weight>=weight则命中,把命中的减去所有weight(本例中是10),然后不断循环。

      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => -5
                  [count] => 1
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => 3
                  [count] => 0
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => 2
                  [count] => 0
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => 0
                  [count] => 1
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => -4
                  [count] => 1
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => 4
                  [count] => 0
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => 5
                  [count] => 1
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => -1
                  [count] => 1
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => -4
                  [count] => 1
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => 0
                  [count] => 2
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => 2
                  [count] => 1
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => -2
                  [count] => 1
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => -5
                  [count] => 3
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => 5
                  [count] => 1
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => 0
                  [count] => 1
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => 0
                  [count] => 3
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => -2
                  [count] => 2
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => 2
                  [count] => 1
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => -5
                  [count] => 4
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => 1
                  [count] => 2
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => 4
                  [count] => 1
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => 0
                  [count] => 4
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => 4
                  [count] => 2
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => -4
                  [count] => 2
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => 5
                  [count] => 4
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => -3
                  [count] => 3
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => -2
                  [count] => 2
              )

      )
      Array
      (
          [a] => Array
              (
                  [weight] => 5
                  [current_weight] => 0
                  [count] => 5
              )

          [b] => Array
              (
                  [weight] => 3
                  [current_weight] => 0
                  [count] => 3
              )

          [c] => Array
              (
                  [weight] => 2
                  [current_weight] => 0
                  [count] => 2
              )

      )

      原文:http://my.oschina.net/fqing/blog/79161

      PHP中copy on write写时复制机制

      PHP

    • 0
    • 0
    • 0
    • 77
    • 单栏布局 侧栏位置: