十年大数据架构师教你如何设计缓存架构

IT知识
329
0
0
2022-05-22
标签   架构设计

由于大数据的迅猛发展,数据呈几何倍数增长,大家不得不讨论关于系统性能的优化问题,而谈到性能优化,势必要谈到缓存架构的设计与使用。几乎是所有人都知道缓存的威力,但是知道终归只是知道,如何真正合理的在自己的项目中进行使用,又是另外一回事了,还是用几个问题来探讨一下,让正在学习大数据的小伙伴更好的了解缓存技术。

在哪些地方可以使用缓存?这里用一个图可能表述的更加清楚!

十年大数据架构师教你如何设计缓存架构

不仅仅如此,还有数据库本身也会有缓存,而且操作系统也有会缓存一些数据。所以,充分的使用好缓存,对性能提升相当的大。

既然谈到缓存,那么就谈细致一点,因为很多时候:谈大帽子的话很多人都会滔滔不绝,但是一到真实的细节与落实的地方,很多人就偃旗息鼓了。

首先就来看看浏览器的缓存。

做过网站的朋友都知道,这个设置主要就是通过设置:Cache-Control 这个响应头来实现的,如下:

十年大数据架构师教你如何设计缓存架构

489034603

不同的技术平台,实现的方式不一样,大家也不要纠结这些平台的差异,只要最后结果是一样的就OK了,要怀着包容心去看每一种技术,如果连技术的差异性都无法容忍,未必也太小家子气了,呵呵呵。

例如,在微软技术的ASP.NET中,可以通过几种方式来实现:

1.页面中设置,如下:

十年大数据架构师教你如何设计缓存架构

2.代码中设置,如下:

十年大数据架构师教你如何设计缓存架构

3.IIS中设置,如下:

十年大数据架构师教你如何设计缓存架构

浏览器缓存可以缓存图片,js,css,当然,还可以把一些数据,通过js对象的形式保存在浏览器中。

浏览器缓存的问题主要在于图片,js,css的更新上面。

例如如果我们设置了缓存的时间为1一个月,那么这些资源很有可能就在一个月还没有到就因为我们发布新的版本而更新了。这个时候,浏览器不会知道的,还是会使用老的版本。

这不是我们希望看到的,解决的办法也是很简单,如果大家留心点,就会发现很多的站点的js,css是这样命名的:XXX-1.2.js

下面看代理缓存,代理缓存的问题,主要出现在三个方面:

1.安全

2.地区问题

3.内容更新问题

首先,对于安全问题,这是最大的问题:因为代理会把根据URL,把整个页面的数据缓存起来,其中就包括了响应头,那么就包含了cookie信息。问题就在这里啦,如果用户A登录之后,代理缓存了页面的响应,那么用户B在此请求相同的页面的时候,那么整个响应就会给B了,这个时候,用户B就可以以A的身份进去瞎搞了。

对于这个问题,没有办法解决,但是有办法避免:把一些不需要用户登录就可以访问的页面,特别是那些静态的内容的页面,可以设置代理缓存;涉及到用户验证才能看的页面,不要设置了。

其次,就是地区问题,

因为代理缓存了整个页面,而且是根据URL来匹配的,如果咱们中国人去访问一个页面,例如

www.agilesharp.com/blog/12344,这个时候,代理缓存就把这个中文的页面内容缓存,如果我们的站点是支持多语言的,那么,此时,如果美国人去访问了同一个URL,那么这个时候,或许,请求不会提交给我们的服务器,代理就会把中文的页面内容给老美,那叫一个郁闷,是吧。

怎么办?呵呵,方法虽然鲜为人知,但是依然简单。

设置头信息:Accept-Language

在发送中文响应的时候,设置为:Accept-Language: zh-cn,那么代理缓存就会缓存这个版本的内容

如果是请求的英文,那么,老美的浏览器发送的请求的这个Accept-Language的信息就是 en-US,代理一看这样版本的内容没有,那么就会把请求交给我们的服务器了。

最后的结果就是代理中缓存了同一个页面的不同版本的内容

好了,现在到了服务器端了,首先看看内核缓存!

其实这个内核缓存就涉及到操作系统和宿主(IIS,Apache等)

说实在的,我对Windows操作系统和IIS比较了解,对其他的不清楚,但是我相信:原理和思想都是一样的!

我先以Windows和IIS为例子吧,说完之后,如果熟悉Liunx,Apache等其他平台的朋友,可以一并分享一下。

首先看一个图:

十年大数据架构师教你如何设计缓存架构

当一个请求被HTTP监听者(HTTP.sys)接受之后,它根据请求的URL进行匹配,然后马上就把请求放在一个内核模式的不同的队列中,以便这些请求可以被用户模式中的应用程序池中工作进程获取,然后处理。这里之所以要把请求放在队列中是为了快速的释放HTTP监听线程,从而使得HTTP.sys可以接受其他更多的请求。另外,请求被放在不同的队列,主要是根据请求的URL来分组的,并且应用程序池中也配置了处理何种URL。

当响应产生之后,响应会被再次发送给HTTP.sys(大家可以看到图中第5个步骤),然后再把响应发送给客户端。HTTP.sys可以基于一些配置将响应进行缓存,我们会在后面进一步的讨论。

这里有一点非常中的就是:HTTP.sys将响应缓存在内核中,并且这个内核中的这个缓存空间是不分页的。

不分页就意味着HTTP.sys总是将响应的内容缓存物理的内存中,而且这一块内存不会被交换出去,就是说不会被分页到磁盘上面。这涉及到了Windows操作系统的内存管理机制,大家自学去吧,呵呵。

当请求的响应被缓存在了内核模式之后,下次再次请求的时候,可以直接的读取缓存,而后续的步骤全部跳过,这会极大的提升性能。

注:今天先到这里,未完待续,还有应用层的缓存,以及如何设计比较智能的缓存。如果小伙伴想要学习大数据架构师的技术,可以加下图片下面的交流群,群里有很多学习视频都可以下载,而且每天大数据架构师马士兵老师都会在群里分享大数据的技术。。