Esempio n. 1
0
 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));
 }
Esempio n. 2
0
        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]);
        }
Esempio n. 3
0
 public static bool ShouldHandleHttpScale(string runtimeSiteName, HttpScaleEnvironment environment)
 {
     return(environment.CurrentFrontEnd == GetForwardFrontEnd(runtimeSiteName, environment));
 }