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); }
public Calculate() { var weightCalculator = new ServiceMetadataWeightCalculator(30); var loadBalance = new RoundRobinLoadBalance(); var registery = new ZooKeeperRegistery(ZooKeeperClient.Instance); _unaryInvoker = new UnaryServiceInvoker(registery, "/dotdubbo/unary/providers", loadBalance, weightCalculator); }
static void Main(string[] args) { var weightCalculator = new ServiceMetadataWeightCalculator(30); var loadBalance = new RoundRobinLoadBalance(); // 创建注册中心 var registery = new ZooKeeperRegistery(ZooKeeperClient.Instance); // 启动并注册 UnaryService Enumerable.Range(UNARY_SERVICE_MIN_PORT, UNARY_SERVICE_MAX_COUNT) .Select(port => HostUnaryService(port)) .ForEach(meta => registery.Register(meta, true), 1000); // 调用 UnaryService var unaryInvoker = new UnaryServiceInvoker(registery, UNARY_SERVICE_PROVIDER_PATH, loadBalance, weightCalculator); for (int i = -1; i >= -10; i--) { Console.WriteLine("unaryInvoker.Negate({0}) = {1}", i, unaryInvoker.Negate(i)); } Console.WriteLine("------------------"); // 启动并注册 CalcService Enumerable.Range(CALC_SERVICE_MIN_PORT, CALC_SERVICE_MAX_COUNT) .Select(port => HostCalcService(port)) .ForEach(meta => registery.Register(meta, true), 1000); // 调用 CalcService var calcInvoker = new CalculateServiceInvoker(registery, CALC_SERVICE_PROVIDER_PATH, loadBalance, weightCalculator); for (int i = 1; i <= 10; i++) { calcInvoker.Multicast(i); Console.WriteLine("{0} + {1} = {2}", i, i + 1, calcInvoker.Add(i, i + 1)); Console.WriteLine("-------------------"); System.Threading.Thread.Sleep(1000); } Console.Read(); // 断开与 ZooKeeper 服务器的连接 ZooKeeperClient.Instance.Dispose(); }