public override void Run()
        {
            var connection = CoordinatorConnection.ConnectAndKeepAlive(Logger, ReceptionistHost, ReceptionistPort, CoordinatorWorkerId, CoordinatorWorkerType);


            Logger.WriteLog("Waiting for target deployment to become ready.");
            var deploymentReadyTask = Task.Run(() => WaitForTargetDeploymentReady(connection));

            if (!deploymentReadyTask.Wait(TimeSpan.FromMinutes(15)))
            {
                throw new TimeoutException("Timed out waiting for the deployment to be ready. Waited 15 minutes.");
            }

            // Read worker flags.
            Option <string> devAuthTokenOpt     = connection.GetWorkerFlag(DevAuthTokenWorkerFlag);
            Option <string> targetDeploymentOpt = connection.GetWorkerFlag(TargetDeploymentWorkerFlag);
            int             deploymentTotalNumSimulatedPlayers = int.Parse(GetWorkerFlagOrDefault(connection, DeploymentTotalNumSimulatedPlayersWorkerFlag, "100"));

            Logger.WriteLog($"Target deployment is ready. Starting {NumSimulatedPlayersToStart} simulated players.");
            Thread.Sleep(InitialStartDelayMillis);

            var maxDelayMillis = deploymentTotalNumSimulatedPlayers * AverageDelayMillisBetweenConnections;

            // Distribute player connections uniformly by generating a random time to connect between now and maxDelayMillis,
            // such that, on average, a player connects every AverageDelayMillisBetweenConnections milliseconds deployment-wide.
            // There can be multiple coordinator workers per deployment, to ensure that the combined connections created by all
            // coordinators are spread out uniformly, generate a start delay for each player independently of other players' start delays.
            var startDelaysMillis = new int[NumSimulatedPlayersToStart];

            for (int i = 0; i < NumSimulatedPlayersToStart; i++)
            {
                startDelaysMillis[i] = Random.Next(maxDelayMillis);
            }

            Array.Sort(startDelaysMillis);
            for (int i = 0; i < NumSimulatedPlayersToStart; i++)
            {
                string clientName  = "SimulatedPlayer" + Guid.NewGuid();
                var    timeToSleep = startDelaysMillis[i];
                if (i > 0)
                {
                    timeToSleep -= startDelaysMillis[i - 1];
                }

                Thread.Sleep(timeToSleep);
                StartSimulatedPlayer(clientName, devAuthTokenOpt, targetDeploymentOpt);
            }

            // Wait for all clients to exit.
            WaitForPlayersToExit();
        }
예제 #2
0
        public override void Run()
        {
            var connection = CoordinatorConnection.ConnectAndKeepAlive(Logger, ReceptionistHost, ReceptionistPort, CoordinatorWorkerId, CoordinatorWorkerType);

            // Read worker flags.
            string devAuthToken     = connection.GetWorkerFlag(DevAuthTokenWorkerFlag);
            string targetDeployment = connection.GetWorkerFlag(TargetDeploymentWorkerFlag);
            int    deploymentTotalNumSimulatedPlayers = int.Parse(GetWorkerFlagOrDefault(connection, DeploymentTotalNumSimulatedPlayersWorkerFlag, "100"));

            Logger.WriteLog($"Starting {NumSimulatedPlayersToStart} simulated players.");
            Thread.Sleep(InitialStartDelayMillis);

            var maxDelayMillis = deploymentTotalNumSimulatedPlayers * AverageDelayMillisBetweenConnections;

            // Distribute player connections uniformly by generating a random time to connect between now and maxDelayMillis,
            // such that, on average, a player connects every AverageDelayMillisBetweenConnections milliseconds deployment-wide.
            // There can be multiple coordinator workers per deployment, to ensure that the combined connections created by all
            // coordinators are spread out uniformly, generate a start delay for each player independently of other players' start delays.
            var startDelaysMillis = new int[NumSimulatedPlayersToStart];

            for (int i = 0; i < NumSimulatedPlayersToStart; i++)
            {
                startDelaysMillis[i] = Random.Next(maxDelayMillis);
            }

            Array.Sort(startDelaysMillis);

            DateTime curTime = DateTime.Now;

            for (int i = 0; i < NumSimulatedPlayersToStart; i++)
            {
                ClientInfo clientInfo = new ClientInfo()
                {
                    ClientName       = $"SimulatedPlayer{Guid.NewGuid()}",
                    StartTime        = curTime.AddMilliseconds(startDelaysMillis[i]),
                    DevAuthToken     = devAuthToken,
                    TargetDeployment = targetDeployment
                };

                LifetimeComponent.AddSimulatedPlayer(clientInfo);
            }

            LifetimeComponent.Start();
        }