CSDN|42 张图带你揭秘后端技术都要学啥?( 二 )


本文插图
集群
缓存架构干啥啥不行 , 缓存第一名 。 不吹牛 , 缓存应用在计算机的各个角落 。 缓存可说是软件技术中的的杀手锏 , 无论是程序代码使用buffer , 还是网络架构中使用缓存 , 虚拟机也会使用大量的缓存 。 其实最初在CPU中也就开始使用缓存 。 缓存分为两种 , 一种是通读缓存 , 一种是旁路缓存

  • 通读缓存
假设当前应用程序获取数据 , 如果数据存在于通读缓存中就直接返回 。 如果不存在于通读缓存 , 那么就访问数据源 , 同时将数据存放于缓存中 。 下次访问就直接从缓存直接获取 。 比较常见的为CDN和反向代理 。 通读缓存CDNCDN称为内容分发网络 。 想象我们京东购物的时候 , 假设我们在成都 , 如果买的东西在成都仓库有就直接给我们寄送过来 , 可能半天就到了 , 用户体验也非常好 , 就不用从北京再寄过来 。 同样的道理 , 用户就可以近距离获得自己需要的数据 , 既提高了响应速度 , 又节约了网络带宽和服务器资源 。
  • 旁路缓存
应用程序需要自己从数据源读取数据 , 然后将这个数据写入到旁路缓存中 。 这样 , 下次应用程序需要数据的时候 , 就可以通过旁路缓存直接获得数据了 。 CSDN|42 张图带你揭秘后端技术都要学啥?
本文插图
旁路缓存缓存的好处
  • 因为大部分缓存的数据存储在内存中 , 相比于硬盘或者从网络中获取效率更高 , 响应时间更快 , 性能更好;
  • 通过 CDN 等通读缓存可以降低服务器的负载能力;
  • 因为缓存通常会记录计算结果 。 如果缓存命中直接返回 , 否则需要进行大量的运算 。 所以使用缓存也减少了CPU 的计算小号 , 加快处理速度 。
缓存缺点我们缓存的数据来自源数据 , 如果源数据被修改了 , 俺么缓存数据很肯能也是被修改过的 , 成为脏数据 , 所以怎么办?
  • 过期失效
在每次写入缓存数据的时候标记失效时间 , 读取数据的时候检查数据是否失效 , 如果失效了就重新从数据源获取数据 。
  • 失效通知
应用程序在更新数据源的时候 , 通知清除缓存中的数据 。 是不是数据使用缓存都有意义呢?非也 , 通常放入缓存中的数据都是带有热点的数据 , 比如当日热卖商品 , 或者热门吃瓜新闻 , 这样将数据存放在缓存中 , 会被多次读取 , 从而缓存的命中率也会比较高 。
异步架构在前面中 , 通过缓存实际上很多时候是解决了读的问题 , 加快了读取数据的能力 。 因为缓存通常很难保证数据的持久性和一致性 , 所以我们通常不会将数据直接写入缓存中 , 而是写入 RDBMAS 等数据中 , 那如何提升系统的写操作性能呢?此时假设两个系统分别为A,B , 其中A系统依赖B系统 , 两者通信采用远程调用的方式 , 此时如果B系统出故障 , 很可能引起A系统出故障 。 从而不得不单独进行升级 , 怎么办?使用消息队列的异步架构 , 也成为事件驱动模型 。 异步相对于同步而言 , 同步通常是当应用程序调用服务的时候 , 不得不阻塞等待服务期完成 , 此时CPU空闲比较浪费 , 直到返回服务结果后才会继续执行 。 CSDN|42 张图带你揭秘后端技术都要学啥?
本文插图
同步举个例子 , 小蓝今天想在系统中加一个发邮件的功能 , 通过SMTP和远程服务器通信 , 但是远程服务器有很多邮件需要等待发送呢 , 当前邮件就可能等待比较长时间才能发送成功 , 发送成功后反馈与应用程序 。 这个过程中 , 远程服务器发送邮件的时候 , 应用程序就阻塞 , 准确的说是执行应用程序的线程阻塞 。 这样阻塞带来什么问题“?
  • 不能释放占用的系统资源 , 导致系统资源不足 , 影响系统性能
  • 无法快速给用户响应结果
但是在实际情况中 , 我们发送邮件 , 并不需要得到发送结果 。 比如用户注册 , 发送账号激活邮件 , 无论邮件是否发送成功都会收到"返回邮件已经发送 , 请查收邮件确认激活" , 怎样才能让应用程序不阻塞?


推荐阅读