阅读更多
之前已经提过通过 Varnish 缓存进行网站性能优化,以及延迟对商业的影响
经历过太多这样的问题分析和定位过程:
  • 某大型网站的 Redis 集群的机器负载每几十分钟出现一个超越平时几十倍大的高峰,结果是因为这些实例每几十分钟对所有数据进行写盘持久化。
  • 某大型媒体网站的 MySQL 读流量异常大,结果是因为每个读操作都携带了 2MB 的页面初始化信息。这个 BUG 修正的直接结果不仅仅是降低了数据库的访问压力,而且是访问延迟直接降低了 75%,另外应用服务器的负载也降低很多,节省了服务器。




还有很多类似的故事。

这些故事看起来可笑,但是发生的原因并不可笑。大部分线上系统都会存在类似的问题。

一方面,所有公司都在大量使用开源软件类库,某些类库并不一定针对大流量设计。另一方面,每个运维和开发人员都难以面面俱到。而且,现在互联网应用越来越复杂,发现问题都非常难。

这种问题自底向上分析是难以避免的,也难以发现,所以应用性能优化需要自顶向下分析,从监控表现入手,寻找线索,进而定位问题。

当然应用整体性能监控、优化,运行成本的降低和把控本身是架构师的主要任务之一。

互联网应用性能优化 (APO, Application Performance Optimization) 有两个大的方向可以做:

1. 应用本身的 BUG 和不合理的地方

无论网站还是移动应用 API,或者是实时通讯和聊天系统,本质上都是用户通过 HTTP 和其他 TCP 协议交互信息的过程。

所以,其中大部分模式都是相通的,并且可以重复利用。比如一些常见的思路和技术:负载均衡、缓存、索引、命名系统、连接重用等等。

随着流量的变化,引起的延迟变化或者机器负载变化,有经验的架构师或者运维基本心里有数。通过对商业模式的分析,相对应的在线业务系统应该有的延迟、服务器压力等等数据可以从心里估算出大致的范围。结合此业务系统的监控图表,基本可以很快看出不合理的地方。然后从一个线索入手定位问题所在,进行修复。

2. 应用业务之外的架构层次的修改

假如不考虑程序的 BUG 或者代码本身的优化,在这之上的一个层次也可以有很多可以优化的方向。

这里主要说明一个利用 最终一致性 的思路修改缓存系统对网页延迟的优化。

Varnish 4.0 增加了一个新功能:
引用
Background (re)fetch of expired objects. On a cache miss where a stale copy is available, serve the client the stale copy while fetching an updated copy from the backend in the background.


假如 cache miss,立刻返回给用户一个之前的旧版本缓存,然后再从应用服务器请求新的版本。这意味着如果缓存足够大,可以让用户 100% 访问到 Varnish 服务器上缓存的版本,而跳过后端服务器的延迟。这也是为什么标题写着降低到 0ms :-) 有点标题党了。

具体的实现方式:
1.保证缓存存储足够大
2.保证 Grace 时间足够长(无限长)
3.假如 obj.ttl + obj.grace > 0s 则返回缓存,否则访问后端服务器。
这样离保证用户 100 % 命中缓存还差一步,就是缓存的预热。为了避免第一个用户访问后端服务器,我们通过主动抓取的方式,或者叫做缓存推送的方式进行缓存的预热。方式很简单,逐个向每个 Varnish 实例请求网站的所有 URL。另外,新生成的 URL,首先进行预热。

需要注意的是,这种方式只适合于用户对信息新旧不是非常敏感的场景,比如所有的媒体页面,说明页面,电商网站的产品说明页面,移动应用的 Feed API (跳出 Varnish,应用类似思路)。另外,这个方案适用于所有需要针对搜索引擎 SEO 进行延迟优化的场景。

本文转自:互联网技术和架构
  • 大小: 72.9 KB
1
1
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 用DAO读写Access文件

    用DAO读写Access文件

  • 学习JDBC的Dao模式

    学习JDBC的Dao模式。

  • DAO 学习笔记

    先定义一个实体类,该类对象与数据表中的每条记录一一对应,DAO实现类中的方法用到实体类对象,并封装好与数据库连接的代码,以及相应的业务代码,例如:删除记录、增加记录、修改记录等。 ...

  • DAO学习笔记

    1、DAO Date Access Object,封装了数据访问的逻辑,调用者(一般是业务逻辑模块)不需要了解封装的细节,当细节发生改变时,不会影响调用者。 优势:提升代码的扩展性,方便后期维护。   2、如何写一个DAO 第一步:定义实体类 属性与表字段一一对应,并且提供get/set方法   第二步:定义DAO接口 定义一些与具体技术无关的方法 ResultSet find

  • 学习Dao模式

      Dao模式相信程序员xdjm都应该知道,一个非常经典的模式 用了很长时间,在此总结一下. 一.什么是DAO DAO是DataAccessObject数据访问接口, 二.DAO的功能: <v:shapetype id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" filled="f" stroked="...

  • iText5实现Java生成PDF文件完整版

    最近项目中使用到Java实现导出PDF文件,经过一番参考研究最终决定使用itextpdf来实现,当然也可以参考 PDF Java类库:Spire.PDF for Java(https://www.e-iceblue.cn/spirepdfjava/create-pdf-in-java.html)。...

  • Java生成PDF文件(Itext篇)

    在企业的信息系统中,报表处理一直占比较重要的作用,iText是一种生成PDF报表的Java组件。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的...

  • iText 5

    https://github.com/itext/itextpdf 您可以在此处找到最新版本: http://github.com/itext/itextpdf/releases/latest 依赖加入: properties> <maven.compiler.source>8</maven.compiler.source> &...

  • 【转载】iText5实现Java生成PDF文件完整版

    最近项目中要使用Java实现PDF文件导出企业报告,于是研究收集资料,下文为比较完整的实现方案,备后期学习,感谢前辈的贡献。 最近项目中使用到Java实现导出PDF文件,经过一番参考研究最终决定使用itextpdf来实现。...

  • C#:IText构造PDF文件

    IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象。 Document有三种构造函数: public Document(); public Document...

  • 个人学习-java-使用DBUties 编写DAO

    接口: public interface DAO{ void update(Connection connection,String sql,Object ... arges);  //更新的方法 T get(Connection connection,String sql,Object ... arges); //返回一个T对象的一条信息 List getforlist(Connect

  • 简单学习 JDBC的DAO模式

    JDBC操作数据库Dao模式的简单设计

  • Dao模式学习总结

    Dao模式学习总结: 1、dao:Data Access Object(数据存取对象) 什么是dao模式:DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的业务逻辑分开,此模式的主要作用是封装对数据库的各种操作; 2、一个典型的dao模式应该包括: (1)vo:(value object)值对象,只包含属性,对应于数据库一个表的属 性。 (2)d...

  • 学习DAO模式

    今天大概看了一下JAVA中DAO模式的使用,以前在PHP中使用过DAO模式作为数据访问层的实现方式。但是由于JAVA编程不是很熟练,所以在使用JAVA实现DAO模式的时候还是走了很多弯路。    1. 是否应该将获取链接、关闭链接、关闭Statement、关闭ResultSet等等方法放置在一个单独的类中?比如说DaoUtil。    2. 是否应该使用JNDI和DataSource来替换Driv

  • iText5实现Java生成PDF文件

    通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 官网:http://itextpdf.com/ 第一部分 建立第一个PDF文档 一、主要步骤(5个): 1.新建document对象,可通过一下三种任意一种 ...

  • iText 7 基础

    通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。 ...

  • itextpdf添加表格元素_使用iText在word文档中插入复杂的Table表格

    通过iText不仅可以生成PDF或rtf 的文档,而且可以将XML、Html文件转化为PDF文件。我们看下如何使用itext插入表格。要插入表格首先要创建Table对象如下代码创建了一个2列的表格,声明表格对象至少要指定表格对象有...

  • java itext 读取word,java 中使用itext生成复杂word

    语法:依赖jar包com.lowagieitext2.1.5com.lowagieitext-rups2.1.5com.lowagieitext-rtf2.1.51.设置word纸张的大小...2.设置创建文件参数Document document = new Document(r(ps:纸张大小),右边距,左边距,上边距,下...

  • iText:iText构造PDF文件

    IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象。 Document有三种构造函数:  public Document();  public ...

Global site tag (gtag.js) - Google Analytics