微服务架构中的多级缓存设计

 

缓存,是每位软件开发人员都很熟悉的技术,它是目前架构设计中提高性能最便捷的方式。下面的这个例子:

目前存储架构 存储架构设计_微服务

假设应用程序将原始数据存储在MySQL数据库中。

众所周知MySQL数据库会将数据存储在硬盘以防掉电数据丢失,但是受限于硬盘的物理设计,即使是目前性能最好的SSD硬盘,也跟内存这种高速IO设备差一个数量级。

目前大多数的应用软件都以“度多写少”场景为主。因

此我们需要在设计上进行数据的读写分离,在数据写入时直接落盘处理。

而占比90%的数据读取操作时则以Redis为代表的内存NoSQL数据库读取数据,利用内存的高吞吐瞬间完成数据读取。

当然,缓存不是只要内存代替硬盘这一种形式,在分布式架构下缓存在每一层都有自己的设计,下面的这个微服务的多级缓存架构图为例子:

目前存储架构 存储架构设计_目前存储架构_02

图片从上到下总共4层,分别为:客户端、应用层、服务层以及数据层。

客户端缓存

某商城客户端为浏览器,在浏览器层面我们主要是对HTML的图片、CSS、JS、字体这些静态资源进行缓存。

目前存储架构 存储架构设计_微服务_03

以百度首页为例,打开百度时,在HTTP通过Expires响应头控制静态图片的有效期。Expires代表过期时间。

在这个时间段内,浏览器会将图片以文件形式缓存在本地,再次访问时浏览器不再产生与服务器的实际请求,会从本地直接读取缓存图片。

通过在浏览器端设置Expires可以在很大程度减少重复请求静态资源带来的带宽损耗,这在高并发Web应用中是基础而重要的设置。

应用层缓存

那Expires到底在哪里进行设置?对于浏览器来说它只是客户端,只负责读取Expires响应头,对于Expires要在应用层,也就是CDN与Ndinx中进行设置。

CDN内存分发网络

CDN 全称是 Content Delivery Network,即内容分发网络,是互联网静态资源分发的主要技术手段。

目前存储架构 存储架构设计_微服务_04

我国幅员辽阔,从北京到上海就有上千公里,如果大量的上海用户同时要访问千里之外的北京服务器的资源,这么长的通信必然带来高延迟与很多不可控因素影响数据传输,

如果有某种机制允许将北京的静态文件资源缓存到上海的服务器,上海用户自动就近访问服务器获取资源,这样便可很大程度上降低网络延迟,进而提高系统的可用性。

CDN (内容分发网络) 就是实现这种机制的方式。

对于广域的互联网应用,CDN 几乎是必需的基础设施,它有效解决了带宽集中占用以及数据分发的问题。像 Web 页面中的图片、音视频、CSS、JS这些静态资源,

都可以通过CDN服务器就近获取。

CDN 技术的核心是 “智能DNS”,智能DNS 会根据用户的 IP 地址自动确定就近访问的 CDN 节点。

CDN 网络是在用户和服务器之间增加Cache层,如何将用户的请求引导到Cache上获得源服务器的数据,主要是通过接管DNS实现,这就是CDN的最基本的原理。

目前存储架构 存储架构设计_目前存储架构_05

以某上海用户的浏览器要访问商城首页广告位的 banner.jpg 文件,浏览器通过服务商提供的智能 DNS 服务,将请求自动转发到商城在上海地区准备的 CDN 服务器,上海 CDN 收到请求后首先检查本机是否已缓存过 banner.jpg,如果文件已存在便直接将图片数据返回给客户端;如果没有缓存过,则回源到北京的源数据节点,将 banner.jpg 文件抽取并缓存到上海服务器,最后上海 CDN 节点再将本机的 banner.jpg 返回给客户端。对于 banner.jpg 来说,第一次访问后上海 CDN 节点已缓存该文件,则之后的缓存有效期内所有后续访问由上海 CDN 直接提供。与之类似的,商城应用可以在重要城市搭建 CDN 节点,这样原本集中被发往北京服务器的请求就被分摊到 CDN 节点,这也直接降低了北京机房的带宽压力。

在互联网应用中,因为 CDN 涉及多地域多节点组网,前期投入成本较高,更多的中小型软件公司通常会选择阿里云、腾讯云等大厂提供的 CDN 服务,通过按需付费的方式降低硬件成本。而这些服务商又会为 CDN 赋予额外的能力,比如阿里云、腾讯云 CDN 除了缓存文件之外,还提供了管理后台能为响应赋予额外的响应头。如下所示在阿里云 CDN 后台,就额外设置了 Cache-Control 响应头代表缓存有效期为 1 小时。这里我们额外提一下 Expires 与的 Cache-Control 的区别,Expires 是指定具体某个时间点缓存到期,而 Cache-Control 则代表缓存的有效期是多长时间。Expires 设置时间,Cache-Control 设置时长,根据业务场景不同可以使用不同的响应头。

Nginx 缓存管理
Nginx 是一款开源的、跨平台的高性能 Web 服务器,它有着高性能,稳定性好,配置简单,模块结构化,资源消耗低的优点。同时支持反向代理、负载均衡、缓存的功能。Nginx 是 Web 应用架构中的常客,例如后端 Tomcat 集群便可通过增加 Nginx 前置做软负载均衡,为应用提供高可用特性。

未完待续。