Ejemplo n.º 1
0
        /// <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
            });
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 4
0
        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);
            }
        }