分布式软件架构——客户端缓存

这篇具有很好参考价值的文章主要介绍了分布式软件架构——客户端缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浏览器的客户端缓存

当万维网刚刚出现的时候,浏览器的缓存机制差不多就已经存在了。在 HTTP 协议设计之初,人们便确定了服务端与客户端之间“无状态”(Stateless)的交互原则,即要求客户端的每次请求是独立的,每次请求无法感知、也不能依赖另一个请求的存在,这既简化了 HTTP 服务器的设计,也为它的水平扩展能力留下了广阔的空间。
但无状态并不是只有好的一面。因为客户端的每次请求都是独立的,服务端不会保存之前请求的状态和资源,所以也不可避免地导致它会携带重复的数据,造成网络性能的降低。
那么,HTTP 协议针对这个问题的解决方案,就是客户端缓存。从 HTTP/1.0 到 1.1、再到 2.0 版本的演进中,逐步形成了现在被称为“状态缓存”、“强制缓存”(或简称为“强缓存”)和“协商缓存”这三种 HTTP 缓存机制。

状态缓存

这其中的状态缓存,是指不经过服务器,客户端直接根据缓存信息来判断目标网站的状态。以前只有301/Moved Permanently(永久重定向)这一种,后来在RFC6797中增加了HSTS(HTTP Strict Transport Security)机制,用来避免依赖301/302跳转HTTPS时,可能产生的降级中间人劫持问题,这也属于另一种状态缓存。
分布式软件架构——客户端缓存,缓存,架构
下面是浏览www.hao123.com时发生302重定向的结果状态码,
分布式软件架构——客户端缓存,缓存,架构

几种重定向状态码区别

  • 301 Moved Permanently:永久性定向,该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI;
  • 302 Found:临时性重定向,该状态码表示请求的资源已被分配了新的URI,用户本次临时能使用的URI访问;
  • 303 See Other,307 Temporary Redirect等等略;

比如在Web浏览器中输入www.baidu.com/,而不是http://www.baidu.com/。在这种情况下浏览器假设你想使用HTTP协议,所以它在这个阶段发出一个HTTP请求到www.baidu.com/,同时Web Server会返回301状态码请求重定向到HTTPS站点。接下来浏览器使用HTTPS连接到www.baidu.com/(最终URLhttps://www.baidu.com/)。这时HSTS安全策略保护开始使用HTTP响应头:

Strict-Transport-Security: max-age=172800; includeSubDomains; preload

分布式软件架构——客户端缓存,缓存,架构

响应头的 Strict-Transport-Security 给浏览器提供了详细的说明。 从现在开始,每个连接到该网站及其子域的下一年(172800秒)从这个头被接收的时刻起必须是一个 HTTPS 连接。 HTTP 连接是完全不允许的。 如果浏览器接收到使用 HTTP 加载资源的请求,则必须尝试使用 HTTPS 请求替代。 如果 HTTPS 不可用,则必须直接终止连接。

此外,如果证书无效,将阻止你建立连接。 通常来说,如果 HTTPS 证书无效(如:过期、自签名、由未知 CA 签名等),浏览器会显示一个可以规避的警告。 但是,如果站点有 HSTS,浏览器就不会让你绕过警告。 若要访问该站点,必须从浏览器内的 HSTS 列表中删除该站点。

强制缓存

它对一致性问题的处理策略十分直接:假设在某个时间点内,比如服务器收到响应后的10分钟内,资源的内容和状态一定不会被改变,因此客户端可以不需要经过任何请求,在该时间点到来之前一直持有和使用该资源的本地缓存副本。
根据约定,在浏览器的地址输入、页面链接跳转、新开窗口、前进和后退中,强制缓存都可以生效,但在用户主动刷新页面时应当自动失效
在HTTP协议中,设置了两类可以实现强制缓存的Headers:Expires和Cache-Control

Expires

它是HTTP/1.0协议中开始提供的Header,后面跟随一个截止时间参数。当服务器返回某个资源时,如果带有该Header的话,就意味着服务器承诺在截止时间之前,资源不会发生变动,浏览器可以直接缓存该数据,不再重新发起请求。如下示例,

HTTP/1.1 200 OK
Expires:Sun, 2 Jul 2023 11:26:15 GMT

那么过期时间很直观,但它存在下面几个问题

  1. 受限于客户端的本地时间;
  2. 无法处理涉及到用户身份的私有资源;
  3. 无法描述“不缓存”的语义;

Cache-Control

它是HTTP/1.1协议中开始提供的Header,它的语义更丰富。如果两者同时存在,并且语义存在冲突时,IETF规定必须以Cache-Control为准,以下面为例,下面是缓存时间600秒,

HTTP/1.1 200 OK
Cache-Control:max-age=600

Cache-Control标准的参数包括下面几种:

  • max-age:跟随一个数字,以秒为单位,表示相对于请求时间(Date)多少秒以内,缓存有效;
  • s-maxage:共享缓存的有效时间,提示CDN这类服务器如何对缓存进行失效;
  • public:资源可以被代理、CDN等缓存;
  • private:只能由用户的客户端进行私有缓存;
  • no-cache:不应被缓存,哪怕同一个会话中对同一个URL地址的请求也必须从服务端获取,从而令强制缓存完全失效;
  • no-store:不强制会话中是否重复获取相同的URL资源,但它禁止浏览器、CDN等以任何形式保留该资源;
  • no-transform:禁止资源以任何形式被修改;
  • min-fresh:跟随一个数字,以秒为单位,用于建议服务器能返回一个不少于该时间的缓存资源;
  • only-if-cached:表示服务器希望客户端不要发送请求,只使用缓存来进行响应,若缓存不能命中,则直接返回503/Service Unavailable错误;
  • must-revalidate:表示资源国旗后,一定要从服务器中进行获取,即超过了max-age的时间后,就等同于no-cache;
  • proxy-revalidate:用于提示代理、CDN等资源过期后的缓存行为,除对象不同外,语义和must-revalidate完全一致;

下面是no-cache的示例,
分布式软件架构——客户端缓存,缓存,架构

协商缓存

在HTTP中,协商缓存与强制缓存并没有互斥性,两套机制可以并行工作。协商缓存有下面两种变动检查机制。

根据资源的修改时间进行检查

  • Last-Modified:服务器的响应Header,用来告诉客户端这个资源的最后修改时间;
  • If-Modified-Since:当客户端再次请求时,会通过If-Modified-Since把之前收到的资源最后修改时间发送回服务端;
    如果此时,服务端发现资源在该时间后没有被修改过,就只要返回一个304/Not Modified的响应即可,无需附带消息体,从而达到节省流量的目的。

根据资源唯一表示是否发生变化来检查

  • Etag:服务器的响应Header,用于告诉客户端这个资源的唯一标识。
  • If-None-Match:客户端再次请求时,会通过If-None-Match把之前收到的资源唯一标识发送回服务端;

另外Etag是HTTP中一致性最强的缓存机制。Last-Modified可能产生资源一致性问题,但Etag不会。但是Etag的获取需要服务端对资源(比如Apache服务器的Etag值默认是对文件的索引节点、大小和最后修改时间)进行哈希计算得到,所以开销会大很多。

HTTP的内容协商机制

HTTP协议设计了Accept*、Content-*的响应Header,这些被称为HTTP的内容协商机制。这些响应的含义根据MINE类型和浏览器资源来缓存资源。

参考链接:
1、https://zhuanlan.zhihu.com/p/130946490文章来源地址https://www.toymoban.com/news/detail-526400.html

到了这里,关于分布式软件架构——客户端缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 分布式软件架构——分布式事务TCC和SAGA

    分布式软件架构——分布式事务TCC和SAGA

    TCC 是另一种常见的分布式事务机制,它是“ Try-Confirm-Cancel ”三个单词的缩写,是由数据库专家 Pat Helland 在 2007 年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Opinion》中提出。 前面介绍的可靠消息队列虽然能保证最终的结果是相对可靠的,过程也足够简单(相对于

    2024年02月12日
    浏览(7)
  • 分布式软件架构——传输链路

    分布式软件架构——传输链路

    链路指无源的点到点的物理连接。链路是计算机网络中的一个重要概念,它指的是连接两个网络设备的物理或逻辑路径。简单来说,链路就是电信号或数据在网络中传输的路径。在计算机网络中,链路可以分为物理链路和逻辑链路两种。物理链路是指连接两个网络设备的物理

    2024年02月16日
    浏览(10)
  • 分布式软件架构——内容分发网络

    分布式软件架构——内容分发网络

    其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的

    2024年02月15日
    浏览(9)
  • 【架构设计】单体软件分布式化思考

    单体软件是历史悠久的软件架构形态,以下是一个简单的前后端分离的单体架构的 web 软件。 单体软件采用分布式方案部署,是根据需求而定的。 为了满足不同场景下的需求,单体软件中的客户端、代理层、服务、数据库,都可以以多个副本联合起来,提供服务的方式部署,

    2024年01月18日
    浏览(12)
  • 分布式软件架构——服务端缓存的三种属性

    分布式软件架构——服务端缓存的三种属性

    在透明多级分流系统中,我们以流量从客户端中发出开始,以流量到达服务器集群中真正处理业务的节点结束。一起探索了在这个过程中与业务无关的一些通用组件,包括DNS、CDN、客户端缓存,等等。 实际上,服务端缓存也是一种通用的技术组件,它主要用于减少多个客户端

    2024年02月07日
    浏览(31)
  • 四大软件架构:掌握单体、分布式、微服务、Serverless 的精髓

    四大软件架构:掌握单体、分布式、微服务、Serverless 的精髓

    简介: 如果一个软件开发人员,不了解软件架构的演进,会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点,希望能够帮助软件开发人员拓展知识面。 单体架构比较初级,典型的三级架构,前端(Web/手机端)+中间业务逻

    2024年01月17日
    浏览(15)
  • 【软件开发】大规模分布式系统的容错架构设计

    【软件开发】大规模分布式系统的容错架构设计

    假设有一个数据库,数据库里有一张特别大的表,里面有几十亿,甚至上百亿的数据。更进一步说,假设这一张表的数据量多达几十个 TB,甚至上百个 TB,那么如果用 MySQL 之类的数据库,单台数据库服务器上的磁盘可能都不够放这一张表的数据! 假如你手头有一个超大的数

    2024年02月04日
    浏览(29)
  • 下一代服务架构:单体架构-->分布式架构-->微服务(DDD)-->软件定义架构(SDF with GraphEngine)

    下一代服务架构:单体架构-->分布式架构-->微服务(DDD)-->软件定义架构(SDF with GraphEngine)

    参考:自己实现一个SQL解析引擎_曾经的学渣的博客-CSDN博客    

    2024年02月12日
    浏览(32)
  • 深度解析四大主流软件架构模型:单体架构、分布式应用、微服务与Serverless的优缺点及场景应用

    深度解析四大主流软件架构模型:单体架构、分布式应用、微服务与Serverless的优缺点及场景应用

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月06日
    浏览(36)
  • 【软件开发/设计】分布式架构中的组件(如Kafka、MongoDB和Nginx)如何进行容器化部署

    容器化部署是将应用程序及其依赖打包成一个容器镜像,然后在任何支持容器的环境中运行这个镜像的过程。在分布式架构中,像Nginx、MongoDB、Kafka这样的组件通过容器化可以更易于部署、扩展和管理。以下是这些组件容器化部署的一般步骤和原理: 容器化部署的一般步骤

    2024年02月04日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包