Ejemplo n.º 1
0
        static void RunRoundRobinLoadBalance()
        {
            var roundRobin = new RoundRobinLoadBalance();
            var people = new List <int> {
                210, 350, 440
            }.Select(num => new Person {
                Id = num, Weight = num
            }).ToList();
            var totalWeight     = people.Sum(person => person.Weight);
            var calculator      = new PersonWeightCalculator();
            var limitedWeight   = 10;
            var limitCalculator = new PersonLimitedWeightCalculator(limitedWeight); // 限制最大权重和的权重计算器(当遇到超大的权重和时,对于 RoundRobinLoadBalance 该算法可以提升加权负载的性能,减少内存占用,但命中率可能会产生小幅度的偏差)

            var monitor = people.ToDictionary(person => person, person => 0);

            Console.WriteLine("--- Run round robin load balance with weight[{0}] calculator ---", totalWeight);
            for (int i = 1; i <= 1000; i++)
            {
                var person = roundRobin.Select(calculator, people, "normal");
                monitor[person]++;
            }
            DisplayLoadBalanceMonitor(monitor);

            monitor = people.ToDictionary(person => person, person => 0);
            Console.WriteLine("--- Run round robin load balance with limited weight[{0}] calculator ---", limitedWeight);
            for (int i = 1; i <= 1000; i++)
            {
                var person = roundRobin.Select(limitCalculator, people, "limited");
                monitor[person]++;
            }
            DisplayLoadBalanceMonitor(monitor);
        }
Ejemplo n.º 2
0
        static void RunConsistenHashLoadBalance()
        {
            var consistentHash = new ConsistentHashLoadBalance();
            var people         = Enumerable.Range(10, 4).Select(num => new Person {
                Id = num, Weight = num
            }).ToList();
            var totalWeight     = people.Sum(person => person.Weight);
            var calculator      = new PersonWeightCalculator();
            var limitedWeight   = 10;
            var limitCalculator = new PersonLimitedWeightCalculator(limitedWeight); // 限制最大权重和的权重计算器(当遇到超大的权重和时,对于 ConsistentHashLoadBalance 该算法可以提升加权负载的性能,减少内存占用)

            var monitor = people.ToDictionary(person => person, person => 0);

            Console.WriteLine("--- Run consistent hash load balance with weight[{0}] calculator ---", totalWeight);
            for (int i = 1; i <= 24; i++)
            {
                var person = consistentHash.Select(calculator, people, "normal");
                monitor[person]++;
            }
            DisplayLoadBalanceMonitor(monitor);

            monitor = people.ToDictionary(person => person, person => 0);
            Console.WriteLine("--- Run consistent hash load balance with limited weight[{0}] calculator ---", limitedWeight);
            for (int i = 1; i <= 24; i++)
            {
                var person = consistentHash.Select(limitCalculator, people, "limited");
                monitor[person]++;
            }
            DisplayLoadBalanceMonitor(monitor);
        }
Ejemplo n.º 3
0
        static void RunRandomLoadBalance()
        {
            var random = new RandomLoadBalance(); // 负载均衡器
            var people = Enumerable.Range(10, 4).Select(num => new Person {
                Id = num, Weight = num
            }).ToList();                                                            // 待负载均衡的元素
            var totalWeight     = people.Sum(person => person.Weight);              // 待负载均衡的元素的权重和
            var calculator      = new PersonWeightCalculator();                     // 权重计算器
            var limitedWeight   = 10;
            var limitCalculator = new PersonLimitedWeightCalculator(limitedWeight); // 限制最大权重和的权重计算器(当遇到超大的权重和时,对于 RandomLoadBalance 该算法可以提升加权负载的性能)

            var monitor = people.ToDictionary(person => person, person => 0);       // 命中记数器

            Console.WriteLine("--- Run random load balance with weight[{0}] calculator ---", totalWeight);
            for (int i = 1; i <= 20; i++)
            {
                var person = random.Select(calculator, people);
                monitor[person]++;
            }
            DisplayLoadBalanceMonitor(monitor);

            monitor = people.ToDictionary(person => person, person => 0);
            Console.WriteLine("--- Run random load balance with limited weight[{0}] calculator ---", limitedWeight);
            for (int i = 1; i <= 20; i++)
            {
                var person = random.Select(limitCalculator, people);
                monitor[person]++;
            }
            DisplayLoadBalanceMonitor(monitor);
        }