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

2023-05-16

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 1. 写在废话前的废话

    http blog csdn net hello world2001 article details 7229398 为什么写这些废话 xff1f 可能年过30 xff0c 从生理角度人就开始慢慢衰老 xff0c 当看到一个个年轻人正在经历
  • 第一次面试:hello 上海

    http blog csdn net hello world2001 article details 7229392 时间 xff1a 2001年3月 地点 xff1a 上海 人物 xff1a 我 xff0c 男 xff0c 22岁 xff
  • 3. 毕业前的幸福时光

    http blog csdn net hello world2001 article details 7229403 工作搞定 xff0c 开始happy 3月到6月底 xff0c 几个月最放纵最快乐的时光就这样开始了 大家应该都有过那样的
  • 无病呻吟1:给应届生的话

    http blog csdn net hello world2001 article details 7229404 讲到第一份工作 xff0c 自然要给应届毕业生一点建议 其实这不是我的初衷 xff0c 写这篇文章的主要目的 xff0c
  • 4. 第一次跳槽

    http blog csdn net hello world2001 article details 7229407 第一次跳槽发生在2002年3月 先废话感叹一句 xff0c 三月 xff0c 真是个跳槽的黄金季节 xff0c 至少对我而
  • 无病呻吟2:关于小公司

    http blog csdn net hello world2001 article details 7229410 虽然很快离开了小公司 xff0c 但并不是说小公司不好 xff0c 相反 xff0c 我认为小公司才真正有机会 xff0c
  • 无病呻吟3:10年中最大的心得

    http blog csdn net hello world2001 article details 7229411 生活中 xff0c 人人都是销售 面试的时候 xff0c 要把自己的实力销售给面试者 给上级汇报工作的时候 xff0c 是
  • 手把手教你做一辆mini平衡自行车!

    今天给大家带来的是一个博主老倪制作的迷你的平衡自行车项目 xff0c 虽然是4年前的老项目了 xff0c 不过相信我们仍然能从中学到一些新东西 演示效果 自行车平衡DIY分为3部分介绍 xff1a 第一部分介绍自行车平衡基本物理原理 xff
  • ADIS16448 配置

    span class hljs keyword void span ADIS16448 Init span class hljs keyword void span GPIO InitTypeDef GPIO InitStructure R
  • 5. 第一次跳槽的心得

    http blog csdn net hello world2001 article details 7229415 第一次跳槽成功喽 xff0c 按照惯例 xff0c 还是从求职角度总结下经验吧 1 不打无把握之仗 xff0c 既然决定到
  • 无病呻吟4:关于简历,以及自我否定之否定

    http blog csdn net hello world2001 article details 7229417 终于到了很多人喜欢的骂人环节了 不知道各位看官 xff0c 在自己的简历上花了多少时间 几个小时 xff0c 还是几天 x
  • 6. 混在2002 - 欢乐的世界杯

    http blog csdn net hello world2001 article details 7229422 写混在日本公司的日子前 xff0c 先简单回忆下2002年幸福的上半年 xff0c 以及随后我作出的一个影响我至今的决定吧
  • 无病呻吟6:F4,圈子,与硬通货

    http blog csdn net hello world2001 article details 7229429 F4是个小圈子 xff0c 当然不是台湾那几个奶油小生 xff0c 而是这个日本公司本人所在部门内的一个小团体 其中的成员
  • 7. 路在何方:第一次选择

    http blog csdn net hello world2001 article details 7229430 2009年那次跳槽的时候 xff0c 不止一次的听到猎头和面试公司的人对我说过 xff0c 你的工作背景非常漂亮 xff0
  • 9. 混在2002:和闷骚男的“同居”生活 - 1

    http blog csdn net hello world2001 article details 7229434 说点开心的事情 xff0c 我当时的两个室友 跟这两个人成为死党 xff0c 都是因为合租的缘故 两个人一个叫 老灵通 x
  • 10. 混在2002:和闷骚男的“同居”生活 - 2

    http blog csdn net hello world2001 article details 7248920 继续说当时的室友 xff0c 这两人都是比较有想法 xff0c 有点小浪漫 xff0c 敢想敢为 xff0c 又比较有毅力
  • 11. 挑战500强管理职位前的苦逼生活

    http blog csdn net hello world2001 article details 7351962 至于我当时的状态 xff0c 则是在迷茫中四处寻找突破口 在一番折腾后 xff0c 我终于定下了一个宏大的目标 xff0c
  • 第二次跳槽:意料之外的结局 - 上

    http blog csdn net hello world2001 article details 7352015 2006年的跳槽是我所有跳槽经历中耗费时间最长 xff0c 最痛苦 xff0c 也最纠结的一次 既有正沉浸在即将成功中的喜
  • 14:第二次跳槽:意料之外的结局 - 下

    http blog csdn net hello world2001 article details 7352028 这也是一个出乎我意料之外的机会 在接到这个电话的时候 xff0c 我正跟Accenture IBM HP这些公司打得火热

随机推荐

  • 推荐一个全新硬件/嵌入式刷题网站!免费!好用!

    越来越多的人才从转码变成了转硬件 xff0c 但是转岗过程中会遇到一些问题 xff0c 比如 xff1a 对学习路线不清晰 找不到专业的练习题 企业真题搜寻困难 xff0c 不知道笔面试考察那些内容 基础编程是一个计算机专业的必备技能 xf
  • my.cnf

    http wenku baidu com view d10a7ea20029bd64783e2cdd html My cnf配置选项 mysqld程序 目录和文件 basedir 61 path 使用给定目录作为根目录 安装目录 chara
  • mysql 修改root密码的方法

    如果是刚安装成功后 xff0c 密码为空 xff0c 修改密码方法为 mysqladmin u root password 39 11111 39 密码不为空 xff0c 修改密码方法有两种 xff1a 1 mysqladmin u roo
  • mysqldump用法小结

    1 备份单个数据库 普通备份 xff1a root 64 A server mysqldump u root p 39 111111 39 newjueqi default gt tmp newjueqi default sql root
  • MySQL数据库性能优化之缓存参数优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql perfornamce tuning
  • magento中的启用https

    在Magento的后台管理中 General gt web gt secure 有安全链接的设置 xff0c 所谓安全链接 xff0c 是指启用了https 协议的链接 百度百科中关于https的介绍 xff08 http baike ba
  • 解决magento中guest页面cookie保存时间过短问题

    在magento新的企业版11 xff0c 有个新的功能退货 xff08 RMA xff09 xff0c 不仅能退货 xff0c 还能以guest的身份查看订单的各种信息 xff0c 但在IE下有个问题 xff1a cookies的保存时间
  • 指定magento后台使用的theme

    众所周知 xff0c magneto是能后台配置中指定前台使用的是哪个theme xff0c 但后台呢 xff1f 指定后台的theme xff0c 需要在添加如下的配置 xff1a lt config gt lt stores gt lt
  • MySQL 数据库性能优化之表结构优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql perfornamce tuning
  • MySQL 数据库性能优化之索引优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql performance tuning
  • MySQL 数据库性能优化之SQL优化

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明 链接 xff1a http isky000 com database mysql performance tuning
  • “巨型”的ESP8266模块,快来围观。

    作者 xff1a 晓宇 xff0c 排版 xff1a 晓宇 微信公众号 xff1a 芯片之家 xff08 ID xff1a chiphome dy xff09 01 巨型ESP8266 ESP8266几乎无人不知 xff0c 无人不晓了吧
  • MySQL数据库性能优化之存储引擎选择

    作者 xff1a Sky Jian 可以任意转载 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及版权声明 链接 xff1a http isky000 com database mysql performance tuning s
  • 配置magento后台翻译

    同事在magento中添加了若干翻译 xff0c 但总是没法再后台显示 xff0c 我帮忙查了很久 xff0c 终于找到问题所在了 xff0c 原来没有配置对应module的后台翻译文件 xff0c 所以在后台显示不出翻译 这里贡献一份前后
  • apache安装新模块的方法

    1 检查是否安装 a 编译安装http bin apachectl l grep mod expires b 如果是以DSO方式编译的 xff0c 则查看 ll modules grep expires 注意 xff0c 以上两种情况不能同
  • prototype.js中hide()和show()的一个注意事项

    在项目中遇到一个问题 xff0c 用prototype js的show xff08 xff09 方法要设置某个div为display block 但总是没法成功 xff0c 后来查了手册 xff1a http api prototypejs
  • doxygentoolkit.vim 用法

    http blog chinaunix net space php uid 61 20570759 amp do 61 blog amp id 61 1922274 早就安上了这个东西 xff0c 只是一直没研究它怎么用 因为 emacs
  • 一些vim知识的摘录

    h function list 看内置函数 b name variable local to a buffer w name variable local to a window g name global variable also in
  • 为什么 Vim 使用 HJKL 键作为方向键

    出处 xff1a http blog jobbole com 18650 导读 xff1a 关于这个问题 xff0c 以前网络上有一种说法 xff0c 手指放在键盘上输入时 xff0c HJKL 比方向键距离手指更近 xff0c 自然输入效
  • 蚂蚁变大象:浅谈常规网站是如何从小变大的(一)

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