前言
关于流量治理,其核心在于对数据流量从生成到消费的整个生命周期进行细致管理。这一过程涉及多个阶段,包括流量的产生、传输、处理和消费等等。在这一过程中,我们通常会采取一系列措施,目的是为了实现对流量的有效控制。例如,通过拦截非法流量,使服务免受恶意攻击;通过限制突发流量,以防止服务因超出承载能力而崩溃等等。流量治理的目标是在确保服务稳定、可靠的基础上,也能尽可能的提高系统的响应速度和处理能力,通过一系列的治理策略,使流量能够得到合理的分配与控制,提升用户体验,同时保障整个应用服务的健康和高效运作。
流量如何走过每一道关卡?
首先,我们可以从流量的入口开始,直到流量被业务服务所接受,处理完成这一过程来进行分析,看看整个过程流量到底需要经过哪些环节,每一环节又都能做些什么?
DNS(域名系统)
DNS通常是流量处理的第一道关卡,它的主要职责就是域名解析,也就是将人类可读的域名还原为服务器所认识的IP地址,也正是因为它是第一个获取到IP地址的地方,所以它自然能找到最合适的服务器进行分配,其实也就是根据用户的地理位置为用户选择最近的服务器,从而减少网络延迟,提升访问速度。
性能优化方面,DNS最常见的优化方式就是缓存,从而减少向上查询的次数,由于域名与IP的映射变动并不频繁,因此DNS缓存可以说无处不在,浏览器、操作系统、DNS服务器、CDN服务器、运营商DNS服务器、防火墙等等都会各自缓存一套。
CDN(内容分发服务)
CDN是专门为了加速业务服务的响应而存在的,将一部分的业务内容缓存到CDN节点中,当用户再发起请求访问这部分内容时,请求就会被调度到离用户最近的CDN节点中,并直接由该节点将内容返回给用户,从而有效的减少网络延迟,提升访问速度。
通过在用户与业务服务资源之间加一层CDN服务之后,有效的减少了业务服务的压力,尤其是对于网络带宽的消耗,试想一下,如果服务器需要对用户访问的每张图片、每个视频都进行传输,那真是压力大到随时崩溃。
负载均衡(Load Balance)
接下来就是熟悉的负载均衡了,按七层网络分层来看,通常负载均衡会在第四层传输层或者第七层应用层,也就是常说的四层负载和七层负载。
传统的四层负载均衡一般通过专门的TCP/UDP协议解析服务器优先进行处理,而七层负载基本上就是通过Nginx集群来完成。
负载均衡这一层不仅仅可对流量进行分发,同样也可以进行一些治理工作,比如可根据服务器的负载情况动态的对分发进行选择,可针对特定的源IP进行访问控制,同时还可提供DDoS攻击防护和WAF等安全防护功能。
API网关
到了这一层,流量就真正进入到了业务服务管理范畴内了。如今微服务架构已经成为一种主流的系统设计方案,而API网关又是微服务架构中的关键组件,它要负责请求的路由、负载均衡、认证鉴权等核心功能。通常我们使用的API网关例如:Spring Cloud Gateway或是Zuul都实现了对上述能力的支持。
同时,针对流量的监控、识别也是API网关的重要能力,通常像限流、熔断、降级,黑白名单,通过流量染色实现的灰度发布、链路追踪等也都非常适合在API网管层来实现。
总之,API网关作为微服务架构中的流量唯一入口,提供了一种对流量的集中识别、管理的方式,使得后端服务可以专注于针对具体业务场景下的流量处理策略。
治理的主要思想
微服务架构的主要思想就是将整个系统分解成多个独立的服务,每个服务都可以独立部署、扩展和维护,这同时也会导致一次请求处理可能需要跨越多个服务才能完成,这就得考虑服务之间的通信、依赖等因素给服务带来的额外影响。
从依赖的角度来看,通常我们会对各个服务的重要性进行评定,核心的服务与非核心的服务自然不能按照同等的条件来对待,简单来说,就是当核心服务与非核心服务产生任何冲突时,一定会优先保住核心服务,舍弃非核心服务。
因此对于流量的链路来说,从核心服务向非核心服务发起的请求,就一定是可熔断,可降级的,而从非核心服务向核心服务发起的请求,也一定是可限流、可被拒绝的。当然,同样的思想不仅仅是在核心服务与非核心服务之间才有,就算是核心服务,针对不同业务逻辑也是可以进行分级对待的。
其实,主要就是要做好隔离,这是常用的防止由局部问题向整体问题扩散的方法,要对有限的资源进行合理的分配,这里的资源除了像各种基础设施之外,还包括像线程池、连接池、对象池等,我们要避免这些资源被少数的流量长时间独享,从而导致其他流量无法被及时处理。
关于微服务之间一些链路依赖问题,可以参考《小心掉进微服务的“坑”》这篇文章。
如何能够快速的处理请求
前面主要是针对流量的一些限制、管控,不过限制归限制,我们还是希望能够尽可能的提升系统的吞吐能力,让更多的请求能够得到及时的处理。
通常,前期我们需要做好压测摸高,这样做的目的是为了找出系统所在的瓶颈,并针对性的进行优化,同时也会与线上实际流量进行对比,确保系统当前能够保持一定的富余能力,一来应对业务峰值,二来应对突发状况。
业务服务层面常使用缓存、异步、并行、消息队列等较为通用的方式,同时也可针对具体的业务场景进行特定的设计,比如将步骤尽可能的简化,使用高效的算法,设计特定的存储结构等等。
系统设计层面还有一点非常重要,就是服务的水平扩容能力,在大多数情况下,扩容是一种既快速又有效的提升服务承载能力的方式,所以保持水平扩容的能力是在系统设计时必须要考虑的,一般来说对于无状态的服务,扩容是非常容易的,而像数据库这一类有状态的服务就比较麻烦了,通常它们是无法快速扩容的,并且扩容之后因为要考虑到信息同步所带来的问题,因此代价也是非常大的,所以这一类服务往往也会成为系统承载能力的瓶颈。
预热也是一种有效的提升响应能力的手段,尤其在许多促销活动的场景时,由于对流量有明确的可预见性,因此往往在设计时就可以做一些额外的准备,常见的就是将一些待访问的资源优先加载好,这样当请求到来时即可直接获取。
关于接口响应优化可以参考《12条必会技巧打造超高性能的接口API》这篇文章。
总结
总之,流量治理是贯穿整个系统链路的过程,每个环节不但要各司其职,还要保证互不影响,稳定、可靠始终应当放在第一优先级来考虑,是关乎生死的问题,至于在保障稳定、可靠的前提之下,能做到多大的吞吐量,就取决于各自的能力了,从短期来看这是关乎业务能否继续扩大的问题,从长期来看,如果业务不能扩大,那一样是生死问题。