web cache及squid框架介绍

来源:互联网 发布:matlab软件培训 编辑:程序博客网 时间:2024/05/18 03:28

web cachesquid框架介绍


      学习和从事web cache相关了东东已经有大半年的时间了,回想下这段时间,还是有很多东西可以分享的!

      Cache,中文意思是缓存,是用来将频繁访问的数据,存储于用户本地或者是访问速度很快的存储介质上,以便于提高访问速度及响应时间,我们的电脑的CPU中也有使用缓存,不过我今天这里说的是WEB方面的CACHE,如何合理的使用WEB相关的CACHE,提交用户访问网站的速度及响应时间。 Web缓存位于Web服务器(1个或多个,内容源服务器)和客户端之间(1个或多个):缓存会根据进来的请求保存输出内容的副本,例如html页面, 图片,文件(统称为副本),然后,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。 使用缓存主要有2大理由:减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快;减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。

      为了解决Internet发展迅速和IP地址资源紧张的矛盾,缓存代理服务器的使用越来越广泛,缓存代理服务器(Cache Proxy Server),常用的就是“翻墙”,从去年开始因为ZF对GOOGLE的限制,而我辈又要始终追随GOOGLE,那最好的一个办法就是“翻墙”去GOOGLE了;还有就是需要访问的站点访问速度比较慢,可以通过代理服务器提高访问的速度,以下是一张来至网上的原理图: 

 

      据我所知有比较流行的有:squid,varnish,apache traffic server(ATS),apache,nginx等,从这些功能上。Varnish,apache traffic server和squid是专业的cache服务,而apache,nginx这些都是第三方模块完成。 其中Squid是一种在Linux系统下使用的比较优秀的代理服务器软件,他的历史悠久,功能完善,运行稳定,完整的庞大的cache技术资料,在生产环境广泛的使用(这应该与squid早出来有关),只是他由于历史原因具有单进程单线程缺陷对多核支持不太给力。varnish本身的技术上优势要高于squid,多线程支持多核技术,它采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。 varnish是不能cache到本地硬盘上的。还有强大的通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存。Apache Traffic Server(ATS)是一个高性能的、模块化的HTTP代理和缓存服务器。Traffic Server最初是 Inktomi 公司的商业产品,该公司在2003 年被 Yahoo 收购, 2009 年 8月 Yahoo 向 Apache 软件基金会(ASF)贡献了源代码,并于 2010 年 4月成为了 ASF的顶级项目(Top-LevelProject)。 Apache TrafficServer 现在是一个开源项目,开发语言为C++,我简单看了一下源代码,核心是状态机实现的机制,有强大的插件开发接口提供,项目比较活跃,希望功能完善。

      我工作主要用到squid,总的来说squid功能强大,下面简单说说一路走过来留下的脚印。从做了多年游戏行业转入webcache项目组的时候,很多东西都不懂,不熟悉linux环境,不懂http协议,不懂cache,proxy代理的东西,即使是web开发方面的也没接触过,没法啊!只有依靠互联网的力量,陆陆续续的看过一些资料,罗列如下:

  • Squid: The Definitive Guide
  • 网络代理缓存SQUID存储系统分析
  • RFC2616
  • HTTP The Definitive Guide
  • O'Reilly - Web Caching
  • Squid Programmers Guide

就上面的这些资料了!不可能一下就看完,刚开始时候不要急着一下就去看源代码,可以先看看《Squid: The Definitive Guide》,边看边实验,从从能行上入手;如果你连squid的使用功能都不会那就没法学习源码了!当熟悉了基本功能后,可以试着看一篇论文《网络代理缓存SQUID存储系统分析》,配合调试工具GDB(不习惯gdb也可以用ddd这个工具,在自己的虚拟机上跑个带xwindow系统的linux发行版本就行)跟踪源码,先从总体框架和数据流走向上分析入手,如果与http协议有关的请务必多翻翻资料《RFC2616》,《HTTP The Definitive Guide》是一本比较老的书,但是里面有很多图我非常喜欢,让你很清楚http协议内部的很多握手过程。Squid是一个单进程单线程的cache proxy程序,总的来说框架还是很简单,来show一个框架图:

从上面的图可以很清晰的看出,当client或者cache proxy发出request的时候,与client_side建立连接,client_side就负责read request data,并且解析header,解析成功后尝试在storage system中去查询命中cache object,如果没有命中,直接交给server_side转发到internet去获取response;如果命中了,就要据http过期协议原理查看该cache object是不是已经过期,如果没过期,直接发回response,如果没过期就要像internet发送验证请求;internet一般都返回200或者304,304就直接用cache object返回给client请求,如果是200就要把从internet返回的response data存入storage system 并且返回给client。

当服务器运行起来以后主要的都是一个无限的主循环,来show一个主循环图:

从上面的图可以很清晰的看出,从main函数开始,当初始化完成后就直接进入主循环,这个主循环很简单就只干三件事情:

  • signalHandle:处理squid进程管理方面的信号处理,比如kill,reconfigure等。
  • eventRun:这个主要处理timer事件队列,当timer到达了执行的时间点就执行。
  • comm_select:这个是基于事件驱动模型主要处理socket IO,pipe IO和file IO事件,是主要核心模块。

呵呵,很简单!就只有三个功能分支。事件驱动模型应该大家都知道,据我熟悉的比较好的网络中间件有libevent,ACE这些都是基于事件驱动模型设计的,Nginx也是,可能是高性能服务器必须选择的框架模型!


      顺便附上一张miss处理流程的时间序列图:


原创粉丝点击