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(); }
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(); }