public HttpScaleHandler(HttpScaleManager manager, HttpScaleEnvironment configuration) { _manager = manager; _environment = configuration; _createdTokenCaches = new CacheManager <string>(0, 1024, TimeSpan.FromMinutes(25)); _validatedTokenCaches = new CacheManager <WorkerAuthorizationToken>(0, 1024, TimeSpan.FromMinutes(15)); }
public static string GetForwardFrontEnd(string runtimeSiteName, HttpScaleEnvironment environment) { if (environment.DynamicComputeHttpScaleMaxFrontEndsPerSite <= 0) { throw new ArgumentOutOfRangeException("DynamicComputeHttpScaleMaxFrontEndsPerSite must be greater than 0"); } // each FE handles scale independently if (environment.DynamicComputeHttpScaleMaxFrontEndsPerSite > 2) { return(environment.CurrentFrontEnd); } // this is degenerated case where no FE is alive, all FE should handle var frontEnds = environment.FrontEnds; if (frontEnds.Count == 0) { return(environment.CurrentFrontEnd); } // if only one FE is alive, it should handle if (frontEnds.Count == 1) { return(frontEnds[0]); } var currentBucket = (int)(Fnv1aHashHelper.ComputeHash(runtimeSiteName) % frontEnds.Count); // if only forward to 1 frontend if (environment.DynamicComputeHttpScaleMaxFrontEndsPerSite == 1) { return(frontEnds[currentBucket]); } // forwarding to 2 frontends at most var forwardFrontEnds = new List <string>(2); forwardFrontEnds.Add(frontEnds[currentBucket]); forwardFrontEnds.Add(frontEnds[(currentBucket + 1) % frontEnds.Count]); if (forwardFrontEnds.Any(n => n == environment.CurrentFrontEnd)) { return(environment.CurrentFrontEnd); } var random = new Random(); return(forwardFrontEnds[random.Next() % forwardFrontEnds.Count]); }
public static bool ShouldHandleHttpScale(string runtimeSiteName, HttpScaleEnvironment environment) { return(environment.CurrentFrontEnd == GetForwardFrontEnd(runtimeSiteName, environment)); }