这篇文章主要介绍了构建互联网高性能WEB系统,总结分析了构建高性能WEB系统相关经验与常用技术,需要的朋友可以参考下

互联网开展至今各种运用层出不穷,用户量动辄上亿。所以怎么构建一个优异的高功能、高牢靠的运用体系对每一个开发者至关重要。本文将我所学到和在唯命是从中运用到的一些办法概括总结,期望给其他同学起到一些学习效果,在今后的开发中遇到相似的问题,能快速的找到处理计划。自己首要运用言语是JAVA,所以下面不做特别阐明,都是运用JAVA言语

构建互联网高性能WEB体系经验总结(提升web性能)  构建 互联网 高性能 WEB系统 第1张

高功能的要害

要想做到高功能,我总结了三点:

  • 缓存
    • DNS缓存
    • 数据库缓存
    • 分布式缓存
  • 拆分
    • 业务拆分
    • 数据库拆分
  • 异步
    • 网络异步
    • 磁盘异步
    • 运用音讯
  • 上面举了一些三点中常见的状况,不管什么当地遇到功能瓶颈,谨记这三点,大多数时分都能找到处理计划。以下别离介绍在整个架构中各个方面对这三点的运用

    无状况服务

    说无状况服务咱们首先要想到无状况目标,无状况目标简略的能够理解为没有Field的目标,比方model/entity目标就不归于无状况目标,由于他含有Field,比方典型MVC场景的**Controller,**Service便是无状况的,他们只含有method。有的也是有状况的,比方Structs2结构的Action,所以Structs2现在用得比较少了。有了无状况目标,咱们才有或许构建无状况服务,由于恳求链路中不包括有状况目标,所以咱们每一次恳求都是独立的,这样的架构有助于咱们服务进行扩展。

    无状况服务有时分不行避免的会遇到一些有状况的目标,比方最常见的便是session。由于http恳求自身是无状况的,所以有必要cookie和session合作运用,才干辨认屡次http恳求归于同一用户。一般有两种办法处理:

    • 运用cookie存储
    • 运用分布式session服务

    第一种便是将目标信息悉数存储在cookie中,经过相应的算法等在服务端将cookie中的信息读出来。这些信息一般都会进行加密处理。 第二种办法,便是将session存储在分布式数据库或许分布式缓存中,一般存在redis或许memcache中。那这种服务扩展会依靠第三方数据库或缓存的才能。淘宝有相似的组件,开源国际也有依据memcache和redis的分布式session

    无状况服务用到了拆分和缓存

    业务拆分

    无状况能够使运用服务水平扩展,可是当单个运用太大太臃肿时,有必要对运用进行拆分。笔直拆分即按业务拆分,比方电商体系中,依照订单体系,积分体系等进行拆分。拆分能够便利开发,更便利扩展。体系大了今后,每个业务的访问量是不相同的,比方买家体系必定比卖家体系访问量大得多,这时分就能够只添加买家体系的机器即可。

    除了依照业务的不同拆分红不同的体系以外,针对咱们的运用分层也能够进行拆分,一般分为运用层、逻辑层和原子层。运用层便是各种数据、逻辑业务的拼装,逻辑层含有许多可重用逻辑,原子层直接操作数据库,一些根本的数据操作包括在其间。

    不管以何种办法拆分,拆分今后的体系在物理层面上就别离开来,所以体系间的通讯是拆分中最重要的问题所在。

    RPC

    在RPC服务之前现已许多体系通讯的办法,比方RMI、WebService,可是RPC以更便利,更高效,跨渠道的办法现在成为干流的通讯手法。简直每个大公司都有自己的RPC结构:淘宝的HSF、58的SCF,也有十分多优异的开源结构:Dubbo、GRPC、Thrift等等。国内用dubbo的大公司也许多:京东、当当都是。

    MQ

    RPC调用一般是用在耦合比较重,同步调用的场景下。而MQ作为另一种异步通讯的手法也被广泛运用在各个业务中。常用的有:ActiveMQ、RabbitMQ、Kafka、RocketMQ。前两个一般作为企业级运用,首要特点是支撑十分多的特性和标准。后两者是互联网级的,具有更强力的吞吐和更高的功能,可是献身了许多MQ的特性。mq一般用在要求终究一直性即可的场景,比方用户注册和发积分这两个动作,能够用户注册今后直接回来前台成功,然后发送注册成功音讯给mq体系,发积分动作订阅注册事情,消费mq的事情信息。

    MQ最大的优点便是削峰宽和耦,在RPC式的同步调用场景中,假如同一个逻辑中调用A和B,那么在扩展的时分,A和B必定是需求一起扩展的,可是有了音讯今后,A发送音讯给B,及时B暂时处理不了,也能够比及A峰值往后B持续处理,即便B短期无法匹配A的发送音讯才能也没有联系。

    数据库拆分

    一般项目都会阅历数据量从小到大的改变,所以数据库拆分也是依据不同的数据量现已不同的阶段进行相应的处理。

    读写别离,这是大多数运用在遇到功能瓶颈第一要干的事。大多数互联网运用都是读占道90%以上的场景。所以一主多从,一个master做写,其他slave做读即可。可是这种主从形式也存在一些问题,比方有一些数据需求及时性比较高,便是在写入今后立刻需求读到。由于主从同步是经过log异步仿制,所以存在数据不共同窗口,这个时分有必要要经过强行读取主库来确保数据的安全,在开发的时分必定要注意。

    笔直切割,便是经过拆分将不同的业务放在不同的数据库中,这样就能够削减单一数据库的压力,进步全体功能。笔直切割要注意的是业务鸿沟问题,鸿沟问题便是有一个表,感觉放在A中和放在B库中都适宜。这个就要靠经历了,不能过火的考虑,由于其实不管你在之前分得有多好,在运用的迭代中,总会呈现更多的找不到清晰鸿沟的表。这个问题在业务模块区分中也是相同。

    水平切割,一般便是说sharding。将同一个表中的不同字段,拆分红不同的表,或许将同一张表依照hash或许业务字段分红不同的分片。这种一般需求DAL结构的支撑,其间有TDDL、Cobar、Mycat等。首要便是经过结构让程序编写者对数据库的拆分不行见,就像操作一个数据库相同。不过现在的DAL结构还不能到达这样的意图,尤其是在跨库业务的场景下,一般都需求其他办法处理。

    跨库业务/分布式业务

    跨库业务一般都是经过终究共同性来处理,即不强求ACID都能满意,容许数据不共同的时刻窗口,可是总会有一个时刻点数据会到终究共同的状况。处理计划十分的多,不过中心原理都是相同,不外乎都是靠补偿来完结的。

    缓存的运用

    计算机国际有一句名言:“计算机科学范畴的任何问题都能够经过添加一个直接的中间层来处理”。缓存便是一种中间层。

    运用缓存的场景十分十分的多,简直到了你能想到的一切当地。这儿咱们讲一般的数据库数据缓存

    缓存一般有两种,local和remote,一般来说运用一种缓存即可,由于缓存虽好,可是保护缓存的更新和删去却是一件十分费事得事。一般缓存可分为读缓存(大多数场景)和写缓存(一般针对数据安全性比较低的场景)。

    比方将数据库中的数据读出时一起写入缓存中,下一次读数据的时分就能够直接读取缓存中的数据,然后大大减小数据库的压力,说起来很简略,其实这也存在许多种的架构,每种架构都有利害,咱们能够具体去了解。

    写缓存,便是先将数据写入缓存中,然后一段时刻再耐久化,这样同样会进步功率,这种计划的问题在于假如这时分宕机,部分数据将会丢掉,所以适用于数据安全性较低的场景。

    缓存尽管速度快,除了保护更新较为费事的是,内存也是较为贵重的硬件,所以除了将热门数据存储在缓存中,一般缓存中保护数据的索引或许首要字段用于列表显现,真实的大而全的数据还需求其他办法处理。

    静态化

    关于大多数场景,咱们的数据在必定时刻都是不会改变的,或许说即便改变,也仅仅页面的一小部分会发生改变,能够将不改变的部分独自拿出来做静态化。比方京东商城的页面便是静态化的,静态化今后,数据不必每次都从缓存或许数据库中获得,然后再封装成页面,而是直接恳求回来静态页面,功能无疑提升了十分大。

    除了以上常用的办法外,还要十分多的重要的办法:

    • CDN加快
    • DNS缓存
    • 页面缓存
    • 运用分布式存储
    • 运用多线程编写程序
    转载请说明出处
    知优网 » 构建互联网高性能WEB体系经验总结(提升web性能)

    发表评论

    您需要后才能发表评论