示例#1
0
        static async Task TestGet()
        {
            var sw           = Stopwatch.StartNew();
            var pgq          = new AggPgqClient(pgqList.Select(ep => new PgqClient(ep)).ToArray());
            var lens         = new List <TimeSpan>();
            var z            = 0;
            var empty        = 0;
            var rps          = new RpsMeter();
            var requestCount = 0;

            while (go_on)
            {
                while (z > totalRps)
                {
                    await Task.Delay(1);
                }
                //while (rps.GetRps() > totalRps) await Task.Delay(1);
                Interlocked.Increment(ref z);
                var(queueName, partition, selector) = generateQueue();
                var start = DateTime.Now;
                //rps.Hit();
                requestCount++;
                _ = pgq.Get(queueName, partition, selector).ContinueWith(async t =>
                {
                    var mid = t.Result;
                    if (mid != Guid.Empty)
                    {
                        await pgq.Ack(mid);
                    }
                    else
                    {
                        Interlocked.Increment(ref empty);
                    }
                    Interlocked.Decrement(ref z);
                    lens.Add(DateTime.Now - start);
                });
            }
            sw.Stop();

            while (z > 0)
            {
                await Task.Delay(1);
            }
            lens.Sort();
            lock (Console.Out)
            {
                Console.WriteLine($"GET: NUM: {requestCount}");
                Console.WriteLine($"GET: RPS: {(int)(requestCount / sw.Elapsed.TotalSeconds)}");
                Console.WriteLine($"GET: LAT AVG: {lens.Select(ts => ts.TotalMilliseconds).Average():#}");
                Console.WriteLine($"GET: LAT 95%: {lens[(int)(lens.Count * 0.95)].TotalMilliseconds:#}");
                Console.WriteLine($"GET: EMPTY:   {empty}");
            }
        }
示例#2
0
        static async Task Main(string[] args)
        {
            var cubePods = new List <string>();

            if (KubernetesClientConfiguration.IsInCluster())
            {
                var config = KubernetesClientConfiguration.BuildDefaultConfig();
                var client = new Kubernetes(config);
                pgqList = client.ListNamespacedPod("pgq").Items
                          .Where(i => i.Metadata.Name.StartsWith("pgq-"))
                          .OrderBy(i => i.Metadata.Name)
                          .Select(i => new IPEndPoint(IPAddress.Parse(i.Status.PodIP), 88))
                          .ToArray();
            }

            var pgqs = Environment.GetEnvironmentVariable("H2R_PGQ_LIST");

            if (!string.IsNullOrWhiteSpace(pgqs))
            {
                pgqList = pgqs
                          .Split(',', ';', ' ', '\r', '\n', '\t')
                          .Where(c => !string.IsNullOrWhiteSpace(c))
                          .Select(c => {
                    var parts = c.Split(':');
                    var host  = parts[0];
                    Console.WriteLine(host);
                    return(new IPEndPoint(Dns.GetHostAddresses(host)[0], int.Parse(parts[1])));
                })
                          .ToArray();
            }

            foreach (var ep in pgqList)
            {
                Console.WriteLine("connecting to " + ep);
            }

            var bGet = true;
            var bPut = true;

            if (args.Length > 0)
            {
                bGet = args[0].Contains("get");
                bPut = args[0].Contains("put");
            }

            if (args.Length > 1)
            {
                totalRps = int.Parse(args[1]);
            }

            Console.Write("warming up... ");
            var pgq = new AggPgqClient(pgqList.Select(ep => new PgqClient(ep)).ToArray());
            await pgq.Warmup();

            Console.WriteLine("started!");

            var t = new List <Task>();

            if (bGet)
            {
                t.Add(TestGet());
            }
            if (bPut)
            {
                t.Add(TestPut());
            }

            Console.ReadLine();
            go_on = false;
            await Task.WhenAll(t);
        }