示例#1
0
 public Server(IClientService clientService, IMessageProtocolProcessor protocolProcessor,
               IClientsPool clientsPool, ISettings settings)
 {
     _clientService            = clientService;
     _messageProtocolProcessor = protocolProcessor;
     _clientsPool = clientsPool;
     _settings    = settings;
 }
示例#2
0
        private void spawnThreads(IClientsPool <string> pool, int count)
        {
            for (var i = 0; i < count; i++)
            {
                newThread(pool).Start();
            }

            logClientsCount();
        }
示例#3
0
        private Thread newThread(IClientsPool <string> pool)
        {
            Thread t = null;

            t = new Thread(_ =>
            {
                Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;

                var hitCounter = 0;
                var client     = pool.GetClient();
                var rand       = new Random();

                while (hitCounter < ClientLifetime)
                {
                    Thread.Sleep(HitDelay);

                    // simulate idle clients
                    if (rand.NextDouble() < IdleClientProb)
                    {
                        Thread.Sleep(IdleClientTime);
                        continue;
                    }

                    // simulate dying clients
                    if (rand.NextDouble() < DyingSimProb)
                    {
                        break;
                    }

                    var key   = getRandomKey();
                    var value = getRandomValue();

                    try {
                        client.Set(key, value);
                        Trace.Assert(client.Get(key) == value);
                        client.Del(key);
                    }
                    catch (Exception ex) { logException(ex); }

                    hitCounter++;
                }

                // self-restart;
                _threads.Remove(t.ManagedThreadId);
                newThread(pool).Start();
            });

            _threads.Add(t.ManagedThreadId, t);
            return(t);
        }
示例#4
0
        private IEnumerable <double> pingThread(IClientsPool <string> pool)
        {
            while (true)
            {
                double result;

                try {
                    var client = pool.GetClient();

                    var startTime = DateTime.Now;
                    Trace.Assert(client.Ping());
                    var endTime = DateTime.Now;

                    result = (endTime - startTime).TotalMilliseconds;
                }
                catch (Exception ex) {
                    logException(ex);
                    result = 0.0;
                }

                yield return(result);
            }
        }
示例#5
0
        public void Run()
        {
            // configure benchmark parameters here:
              const int Instances = 7;
              const int Iterations = 10000;
              const bool QuietMode = false; // turn to false to make it wait for key inputs

              Func<Job> getJob = () => new PingJob();

              _settings = RedisSettings.Build()
            .ReconnectOnIdle(false);

              _pool = new RoundRobinPool<string>(_settings, Instances);

              do {

            // setup
            var options = TaskCreationOptions.LongRunning;

            var tasks = Enumerable
              .Range(0, Instances)
              .Select(n => getJob())
              .Select(job => new Task<BenchmarkResult>(
            () => benchMark(job, Iterations), options))
              .ToArray();

            if (!QuietMode) {
              Console.WriteLine("{0} instances of `{1}` each doing {2} iterations.",
            tasks.Count(),
            getJob().Description,
            Iterations);

              Console.WriteLine("Hit any key to start.");
              Console.ReadKey();
            }

            // starting
            if (Instances == 1)
              tasks.First().RunSynchronously();
            else
              Array.ForEach(tasks, t => t.Start());

            Task.WaitAll(tasks);

            // report time taken
            if (!QuietMode) {
              Console.WriteLine("All done.");

              var results = tasks.Select(t => t.Result);

              foreach (var result in results) {
            Console.WriteLine("{0} : {1}ms",
              result.Job.Description,
              result.MillisecondsTaken);
              }

              var avg = results.Average(r => r.MillisecondsTaken);
              var max = results.Max(r => r.MillisecondsTaken);
              var min = results.Min(r => r.MillisecondsTaken);

              Console.WriteLine("Maximum : {0}ms", max);
              Console.WriteLine("Minimum : {0}ms", min);
              Console.WriteLine("Average : {0}ms", avg);

              Console.ReadKey();
            }

              } while (!QuietMode); // don't repeat in quietmode
        }
示例#6
0
        private void spawnThreads(IClientsPool<string> pool, int count)
        {
            for (var i = 0; i < count; i++)
            newThread(pool).Start();

              logClientsCount();
        }
示例#7
0
        public void Run()
        {
            // configure benchmark parameters here:
            const int  Instances  = 7;
            const int  Iterations = 10000;
            const bool QuietMode  = false; // turn to false to make it wait for key inputs

            Func <Job> getJob = () => new PingJob();

            _settings = RedisSettings.Build()
                        .ReconnectOnIdle(false);

            _pool = new RoundRobinPool <string>(_settings, Instances);


            do
            {
                // setup
                var options = TaskCreationOptions.LongRunning;

                var tasks = Enumerable
                            .Range(0, Instances)
                            .Select(n => getJob())
                            .Select(job => new Task <BenchmarkResult>(
                                        () => benchMark(job, Iterations), options))
                            .ToArray();

                if (!QuietMode)
                {
                    Console.WriteLine("{0} instances of `{1}` each doing {2} iterations.",
                                      tasks.Count(),
                                      getJob().Description,
                                      Iterations);

                    Console.WriteLine("Hit any key to start.");
                    Console.ReadKey();
                }

                // starting
                if (Instances == 1)
                {
                    tasks.First().RunSynchronously();
                }
                else
                {
                    Array.ForEach(tasks, t => t.Start());
                }

                Task.WaitAll(tasks);

                // report time taken
                if (!QuietMode)
                {
                    Console.WriteLine("All done.");

                    var results = tasks.Select(t => t.Result);

                    foreach (var result in results)
                    {
                        Console.WriteLine("{0} : {1}ms",
                                          result.Job.Description,
                                          result.MillisecondsTaken);
                    }

                    var avg = results.Average(r => r.MillisecondsTaken);
                    var max = results.Max(r => r.MillisecondsTaken);
                    var min = results.Min(r => r.MillisecondsTaken);

                    Console.WriteLine("Maximum : {0}ms", max);
                    Console.WriteLine("Minimum : {0}ms", min);
                    Console.WriteLine("Average : {0}ms", avg);

                    Console.ReadKey();
                }
            } while (!QuietMode); // don't repeat in quietmode
        }
示例#8
0
        private IEnumerable<double> pingThread(IClientsPool<string> pool)
        {
            while (true) {
            double result;

            try {
              var client = pool.GetClient();

              var startTime = DateTime.Now;
              Trace.Assert(client.Ping());
              var endTime = DateTime.Now;

              result = (endTime - startTime).TotalMilliseconds;
            }
            catch (Exception ex) {
              logException(ex);
              result = 0.0;
            }

            yield return result;
              }
        }
示例#9
0
        private Thread newThread(IClientsPool<string> pool)
        {
            Thread t = null;
              t = new Thread(_ =>
              {
            Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;

            var hitCounter = 0;
            var client = pool.GetClient();
            var rand = new Random();

            while (hitCounter < ClientLifetime) {
              Thread.Sleep(HitDelay);

              // simulate idle clients
              if (rand.NextDouble() < IdleClientProb) {
            Thread.Sleep(IdleClientTime);
            continue;
              }

              // simulate dying clients
              if (rand.NextDouble() < DyingSimProb)
            break;

              var key = getRandomKey();
              var value = getRandomValue();

              try {
            client.Set(key, value);
            Trace.Assert(client.Get(key) == value);
            client.Del(key);
              }
              catch (Exception ex) { logException(ex); }

              hitCounter++;
            }

            // self-restart;
            _threads.Remove(t.ManagedThreadId);
            newThread(pool).Start();
              });

              _threads.Add(t.ManagedThreadId, t);
              return t;
        }
示例#10
0
 public RedisSessionStore(IClientsPool clientsPool)
 {
     _pool = clientsPool;
 }
示例#11
0
 public MeseClientService(IClientsPool clientsPool)
 {
     _clientsPool = clientsPool;
 }
 public MeseMessageProtocolProcessorDecorator(IMessageProtocolProcessor innerProcessor,
                                              IClientsPool clientsPool)
 {
     _innerProcessor = innerProcessor;
     _clientsPool    = clientsPool;
 }