蚂蚁变大象:浅谈常规网站是如何从小变大的(一)

news/2024/5/10 17:22:53/文章来源:https://blog.csdn.net/newjueqi/article/details/7536745

http://zgwangbo.blog.51cto.com/4977613/849529


标签:架构 web
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://zgwangbo.blog.51cto.com/4977613/849529

【 前一段时间写了关于架构的总结,一共十篇,放在新浪博客上 :http://blog.sina.com.cn/zgwangbo001 ,今天放到51cto上】

 

         话说今天是清明节假期第一天,早上早早的和朋友开车逃离了帝都。现在正在G104上缓慢的爬行。

         言归正传,计划了很久写这篇文章,不过心里还是比较忐忑,担心自己在技术上的深度和沉淀还是不够。不过,最后想起某老师说的:follow my heart! 想想,人生就这么些年,想做啥就做啥吧,不用想的太多。

 

――――――――――――― 技术开始的分割线 ―――――――――――――

 

         2005年,我开始和朋友们开始拉活儿做网站,当时第一个网站是在linux上用jsp搭建的,到后来逐步的引入了多种框架,如webworkhibernate等。在到后来,进入公司,开始用c/c++,做分布式计算和存储。(到那时才解开了我的一个疑惑:C语言除了用来写HelloWorld,还能干嘛?^_^)。

         总而言之,网站根据不同的需求,不同的请求压力,不同的业务模型,需要不同的架构来给予支持。我从我的一些经历和感受出发,大体上总结了一下的一些阶段。详情容我慢慢道来。

       

         【第一阶段 : 搭建属于自己的网站】

         我们最先开始的网站可能是长成这个样子的:

 


         我们用jspaspphp等页面语言搭建最简单的业务逻辑,将数据存放在通用关系数据库中,如果有必要还搭建一个WebServer(如果偷懒的话,jsp直接使用tomcatresin当服务器,连apache都省了)。所有的东西都放在一台服务器上(实际可能是买一个空间或者托管服务器)。这里有一个经典的单词:LAMP

         这个时候,我们的业务可能比较简单,往往是做一个×××Management Information System;数据量也比较小,通常都是几千,最多也就几万条记录;压力也比较小,估计也就每天几千,最多几万次请求。

         这样做的好处就是简单,入门快。所有的代码都写在Server Page中,看起来就像是HTML中增加了很多怪异的非HTML标签和代码。根据不同的逻辑和机器性能,单机性能从几十到几千QPS(一般能到100就不错了,^_^)。

         不过问题也很明显,就是页面集成了各种代码,既要负责处理请求参数,又要处理各种逻辑,还要负责连接数据库,最后输出显示…… 可想而知,代码的可重用性和可维护性是不太好的。而且,还有一个问题,像JSP这样的语言,必须在请求时才能编译,生成class代码,调试上很难受。

         嗯,于是呢,我们考虑代码的可重用性和可维护性了。

 

 

         【第二阶段 : 增强代码可重用性和可维护性】

 

         我们引入了很多框架,来帮我们解决重用性问题和可维护性问题。

 


         Java做例子,我们可能会引入strutsspringhibernate等框架,用来做URL分流,CVM隔离,数据的ORM等。这样,我们的系统中,数据访问层可以抽取出很多公用的类,业务逻辑层也可以抽取出很多公用的业务类,同一个业务逻辑可以对应多个展示页面,可复用性得到极大的增强。

         不过,从性能上看,引入框架后,效率并不见得比第一种架构高,有可能还有降低。因为框架可能会大量引入“反射”的机制,来创建对应的业务对象;同时,也可能增加额外的框架逻辑,来增强隔离性。从而使得整体服务能力下降。幸好,在这个阶段,业务请求量不大,性能不是我们太care的事情。J

 

 

         【第三阶段 :降低磁盘压力 

 

         可能随着业务的持续发展,或者是网站关注度逐步提升(也有可能是搜索引擎的爬虫关注度逐步提升。我之前有一个网站,每天有超过1/3的访问量,就是各种爬虫贡献的),我们的请求量逐步变大,这个时候,往往出现瓶颈的就是磁盘性能。在linux下,用vmstatiostat等命令,可以看到磁盘的bibowaitutil等值持续高位运行。怎么办呢?

         其实,在我们刚刚踏进大学校门的时候,第一门计算机课程——《计算机导论》里面就给出了解决方案。依稀记得下面这个图:

 

         在我们的存储体系里面,磁盘一般是机械的(现在FlashSSD等开始逐步大规模使用了),读取速度最慢,而内存访问速度较快(读取一个字节约10μs,速度较磁盘能高几百倍),速度最快的是CPUcache。不过价格和存储空间却递减。

         话题切换回来,当我们的磁盘出现性能瓶颈的时候,我们这个时候,就要考虑其他的存储介质,那么我们是用cpu cache还是内存呢,或是其他形态的磁盘?综合性价比来看,到这个阶段,我个人还是推荐使用内存。现在内存真是白菜价,而且容量持续增长(我现在就看到64G内存的机器[截止2012-4-3])。

         但是问题来了,磁盘是持久化存储的,断电后。数据不会丢失,而内存却是易失性存储介质,断电后内容会丢失。因此,内存只能用来保存临时性数据,持久性数据还是需要放到磁盘等持久化介质上。因此,内存可以有多种设计,其中最常见的就是cache(其他的设计方式会在后面提及)。这种数据结构通常利用LRU算法(现在还有结合队列、集合等多种数据结构,以及排序等多种算法的cache),用于记录一段时间的临时性数据,在必要的时候可以淘汰或定期删除,以保证数据的有效性。cache通常以Key-Value形式来存储数据(也有Key-SubKey-Value,或者是Key-List,以及Key-Set等形式的)。因为数据存放在内存,所以访问速度会提高上百倍,并且极大的减少磁盘IO压力。

         Cache有多种架构设计,最常见的就是穿透式和旁路式。穿透式通常是程序本身使用对应的cache代码库,将cache编译进程序,通过函数直接访问。旁路式则是以服务的方式提供查询和更新。在此阶段,我们通常使用旁路式cache,这种cache往往利用开源的服务程序直接搭建就可以使用(如MemCache)。旁路式结构如下图:

 

         请求来临的时候,我们的程序先从cache里面取数据,如果数据存在并且有效,就直接返回结果;如果数据不存在,则从数据库里面获取,经过逻辑处理后,先写入到cache,然后再返回给用户数据。这样,我们下次再访问的时候,就可以从cache中获取数据。

         Cache引入以后,最重要的就是调整内存的大小,以保证有足够的命中率。根据经验,好的内存设置,可以极大的提升命中率,从而提升服务的响应速度。如果原来IO有瓶颈的网站,经过引入内存cache以后,性能提升10倍应该是没有问题的。

         不过,有一个问题就是:cache依赖。如果cache出问题(比如挂了,或是命中率下降),那就杯具了L。这个时候,服务就会直接将大的压力压向数据库,造成服务响应慢,或者是直接500

         另外,服务如果重新启动时,也会出现慢启动,即:给cache充数据的阶段。对于这种情况,可以采取回放日志,或是从数据库抽取最新数据等方式,在服务启动前,提前将一部分数据放入到cache中,保证有一定命中率。


 

本文出自 “老王的技术博客” 博客,请务必保留此出处http://zgwangbo.blog.51cto.com/4977613/849529


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_780770.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么很多网站都去除oracle?

一个字,贵。你可以去Oracle官网看看Oracle的报价,一套Oracle database动辄几十万,或者按年付费,一年大几万,这还是一个CPU的价格。 碰到集群你就等着哭吧。人员培训也是问题。Mysql很多人学数据库的时候多多少少都会用…

大型网站架构演化发展历程

原文:http://www.cnblogs.com/JustOnly/p/4899615.html 前面已经描述了大型网站系统的特点,而对一个大型网站系统,其架构也是重要的一个环节。 大型网站技术主要的挑战来自于庞大的用户、高并发以及海量的数据这三个方面。大型网站的形成就像…

发现了好的网站

今天在查找DNN,以及rainbow的资料时,发现了几个好的网站,并在上边注册;www.dnnskins.com, www.asp.net www.codeproject.com 通过查看,对dnn,rainbow有了新的认识转载于:https://www.cnblogs.com/mengfan/arch…

影响我的网站速度的因素

测试几个主网页总结出影响我的网页速度的几个因素: 一级因素: ①启动压缩 ②浏览器缓存 二级因素: ①提供压缩后的图片 找到原因下面就好办了,对症下药,下面将一个个解决。 解决办法: 开启压缩功能-…

别找了!这5个图片素材网站分享给你,每一个都资源满满!

职场中的工作日常就是找素材,但是需要找到合适的图片素材真的是难上加难。废话就不多说了,今天小编就给大家分享5个图片素材网站,资源真的超级丰富!有需要的小伙伴记得收藏!Pixabay链接:http://pixabay.com…

大型网站架构系列:分布式消息队列

一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能,高可用,可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。 目前在生产环境&#xff0…

一个母婴电子商务网站的大数据平台及机器学习实践

母婴相对一般的电子商务网站有一些特点:第一个特点是商品周期短,在母婴网站上的商品,在线的时间不会超过5-7天,第二个是用户需求的变化快,在母婴行业,可能是用户的需求变化最快的领域,比如是用户…

大型网站架构技术一览

网站系统架构层次如下图所示: 1.前端架构 前端指用户请求到达网站应用服务器之前经历的环节,通常不包含网站业务逻辑,不处理动态内容。 浏览器优化技术 并不是优化浏览器,而是通过优化响应页面,加快浏览器页面的加载…

大型网站图片服务器架构的演进

在主流的Web站点中,图片往往是不可或缺的页面元素,尤其在大型网站中,几乎都将面临“海量图片资源”的存储、访问等相关技术问题。在针对图片服务器的架构扩展中,也会历经很多曲折甚至是血泪教训(尤其是早期规划不足&am…

大型网站架构系列:分布式消息队列

以下是消息队列以下的大纲,本文主要介绍消息队列概述,消息队列应用场景和消息中间件示例(电商,日志系统)。 本次分享大纲 消息队列概述消息队列应用场景消息中间件示例JMS消息服务常用消息队列参考(推荐&…

浅谈web网站架构演变过程

前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变。该系统具备的功能:用户模块:用户注册和管理商品模块:商品展示和管理交易模块:创建交易和管理 阶段一、单机构建网站 网…

大型网站系统架构分析

千万级的注册用户,千万级的帖子,nTB级的附件,还有巨大的日访问量,大型网站采用什么系统架构保证性能和稳定性? 首先讨论一下大型网站需要注意和考虑的问题。 数据库海量数据处理:负载量不大的情况下select、…

如何对一个网站进行分析

有时,我们浏览到某个网站,觉得不错,然后就决定把其中的某个功能或产品应用到自己的网站上。这样做或许有时候能够对自己的网站有帮助,但是这往往是一个草率的做法。最好经过充分的考虑和分析之后再做决定。从做事的逻辑结构来看&a…

超人气新书《SEO实战密码——60天网站流量提高20倍》火爆热销

超人气新书《SEO实战密码——60天网站流量提高20倍》火爆热销 11月底,《SEO实战密码——60天网站流量提高20倍》在全国读者的翘首企盼中正式面市,仅一周的时间,它便以令人窒息的速度在卓越网迅速脱销,当当网签名本2天之内抢售一空…

如何设计通用的网站模板

现在网络上已经到处可以看到使用模板开发出来的网站。使用模板开发网站有很多好处,最主要的就是模板与程序完全脱离,用户可以根据规定好的标签任意开发模板,导入到模板引擎里就能正常运行。所以美工人员跟程序编写人员彻底的独立了。提高了开…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

网站设计常用技巧(转)

先说一下写这篇文章的目的吧,这上面的东西很多不是我写的,也不是我总结的,这点我肯定,呵呵,我希望大家也能提提你自己的建议,希望不断总结, 让更多的网站设计技巧出现在这里,方便 查…

(一)高并发redis学习笔记:小电商网站架构与高并发架构区别

主要的知识: redis集群storm集群nginxtomcatmysql 真正能支撑高并发以及高可用的复杂系统中的缓存架构有哪些东西? (1)如何让redis集群支撑几十万QPS高并发99.99%高可用TB级海量数据企业级数据备份与恢复?&#xff1…

配置ISA Server以创建站点到站点*** 连接之二(接续之一)

在本练习中,您将对两个 ISAServer 阵列进行配置以创建站点到站点 *** 连接。注意:本实验室练习使用以下计算机:Denver - Florence - Berlin - Istanbul 注意:在以下任务中,您将配置 GERMANY 阵列以使用站点到站点 *** …

PHP网站头部通栏设计

1.把网站添加到桌面&#xff1a; <a href"shortcut.php">放到桌面上</a> <?PHP$Shortcut "[InternetShortcut]URLhttp://www.xxx.comIDListIconFilehttp://www.xxx.com/favicon.ico//图标IconIndex1[{000214A0-0000-0000-C000-000000000046}]P…