/// <summary>选择队列</summary> /// <returns></returns> public MessageQueue SelectQueue() { if (_robin == null) { var list = Brokers.Where(e => e.Permission.HasFlag(Permissions.Write) && e.WriteQueueNums > 0).ToList(); if (list.Count == 0) { return(null); } var total = list.Sum(e => e.WriteQueueNums); if (total <= 0) { return(null); } _brokers = list; _robin = new WeightRoundRobin(list.Select(e => e.WriteQueueNums).ToArray()); } // 构造排序列表。希望能够均摊到各Broker var idx = _robin.Get(out var times); var bk = _brokers[idx]; return(new MessageQueue { BrokerName = bk.Name, QueueId = (times - 1) % bk.WriteQueueNums }); }
static void Test3() { var list = new List <BrokerInfo> { new BrokerInfo { Name = "A", WriteQueueNums = 5 }, new BrokerInfo { Name = "B", WriteQueueNums = 7, Addresses = new[] { "111", "222" } }, new BrokerInfo { Name = "C", WriteQueueNums = 9 }, }; var list2 = new List <BrokerInfo> { new BrokerInfo { Name = "A", WriteQueueNums = 5 }, new BrokerInfo { Name = "B", WriteQueueNums = 7, Addresses = new[] { "111", "222" } }, new BrokerInfo { Name = "C", WriteQueueNums = 9 }, }; Console.WriteLine(list[1].Equals(list2[1])); Console.WriteLine(list2.SequenceEqual(list)); var robin = new WeightRoundRobin(list.Select(e => e.WriteQueueNums).ToArray()); var count = list.Sum(e => e.WriteQueueNums); for (var i = 0; i < count; i++) { var idx = robin.Get(out var times); var bk = list[idx]; Console.WriteLine("{0} {1} {2}", i, bk.Name, times - 1); } }
/// <summary>启动</summary> /// <returns></returns> public override Boolean Start() { if (!base.Start()) { return(false); } if (LoadBalance == null) { LoadBalance = new WeightRoundRobin(); } if (_NameServer != null) { _NameServer.OnBrokerChange += (s, e) => { _brokers = null; //_robin = null; LoadBalance.Ready = false; }; } return(true); }
static void Test3() { var dic = new SortedList <String, String>(StringComparer.Ordinal) { ["subscription"] = "aaa", ["subVersion"] = "ccc", }; Console.WriteLine(dic.Join(",", e => $"{e.Key}={e.Value}")); Console.WriteLine('s' > 'V'); Console.WriteLine(); var cmp = Comparer <String> .Default; Console.WriteLine(cmp.Compare("s", "S")); Console.WriteLine(cmp.Compare("s", "v")); Console.WriteLine(cmp.Compare("s", "V")); Console.WriteLine(); var cmp2 = StringComparer.OrdinalIgnoreCase; Console.WriteLine(cmp2.Compare("s", "S")); Console.WriteLine(cmp2.Compare("s", "v")); Console.WriteLine(cmp2.Compare("s", "V")); Console.WriteLine(); cmp2 = StringComparer.Ordinal; Console.WriteLine(cmp2.Compare("s", "S")); Console.WriteLine(cmp2.Compare("s", "v")); Console.WriteLine(cmp2.Compare("s", "V")); //dic.Clear(); //dic = dic.OrderBy(e => e.Key).ToDictionary(e => e.Key, e => e.Value); //Console.WriteLine(dic.Join(",", e => $"{e.Key}={e.Value}")); var list = new List <BrokerInfo> { new BrokerInfo { Name = "A", WriteQueueNums = 5 }, new BrokerInfo { Name = "B", WriteQueueNums = 7, Addresses = new[] { "111", "222" } }, new BrokerInfo { Name = "C", WriteQueueNums = 9 }, }; var list2 = new List <BrokerInfo> { new BrokerInfo { Name = "A", WriteQueueNums = 5 }, new BrokerInfo { Name = "B", WriteQueueNums = 7, Addresses = new[] { "111", "222" } }, new BrokerInfo { Name = "C", WriteQueueNums = 9 }, }; Console.WriteLine(list[1].Equals(list2[1])); Console.WriteLine(list2.SequenceEqual(list)); var robin = new WeightRoundRobin(list.Select(e => e.WriteQueueNums).ToArray()); var count = list.Sum(e => e.WriteQueueNums); for (var i = 0; i < count; i++) { var idx = robin.Get(out var times); var bk = list[idx]; Console.WriteLine("{0} {1} {2}", i, bk.Name, times - 1); } }