# Pick a droplet based on original backend addr or pick a droplet randomly
if sticky
_, host, port = Router.decrypt_session_cookie(sticky)
droplet = check_original_droplet(droplets, host, port)
end
# pick a droplet use load balance policy
lb_policy = Router.lb_policy
droplet ||= droplets[rand(droplets.size)][:load_val]?
load_balance(droplets,lb_policy):droplets[rand(droplets.size)]
有状态的(stateful)请求不经过智能路由的处理。比如,当存在session时,第一次请求之后,服务器将响应该请求的
实例信息回写至客户端的cookie中,当router收到该客户端的下一次请求时,会将其转发给同一实例。
也许有人会问,这样做是否会影响请求的响应时间?答案是肯定的,但是影响很小,因为该算法是纯数值计算,效率
非常高。目前的算法只考虑了几个常用的因素,还存在优化的空间,比如增加负载的因素,如I/O,实例带宽使用情况
等。
弹性伸缩(Auto-scaling)
接续上一话题,当并发量持续增大,通过智能路由可以均衡所有实例的负载,但如何应对实例的负载持续升高,面临
应用随时不可用的情况?只有增加实例!虽然,我们可以通过JAE控制界面轻松地为一个应用增加或减少实例数(只
要在资源满足的情况下)。但这种纯手动的方法显然不可取,JAE将此过程自动化,所采用的就是弹性伸缩机制。
惯用的方法就是定义伸缩规则,下面这是JAE管理页面的规则设置:
规则是用户层面的全局定义,每个用户可以创建多个规则,具体的应用绑定规则之后才能生效。
规则的正确执行依赖于“过去几分钟内,应用的平均请求次数”这一指标。我们通过实时统计来获取这一指标,其实现流
程图如下图所示:
评论0
最新资源