阿里P7架构师面试:大型网站应用之海量数据、高并发解决方案

链接:https://www.cnblogs.com/zhuzhen/p/9340941.html

阿里P7架构师面试:大型网站应用之海量数据、高并发解决方案

文章插图
 
海量数据的解决方案:
  1. 使用缓存 。
  2. 页面静态化技术 。
  3. 数据库优化 。
  4. 分类数据库中活跃的数据 。
  5. 批量读取和延迟修改 。
  6. 读写分离 。
  7. 适应nosql和Hadoop技术 。
  8. 分布式部署数据库 。
  9. 应用服务和数据服务分离 。
  10. 使用搜索引擎搜索数据库中的数据 。
  11. 进行业务拆分 。
一、使用缓存 。网站访问数据的特点大多数呈现为“二八定律”:80%的业务访问集中在20%的数据上 。例如:在某一段时间内百度的搜索热词可能集中在少部分的热门词汇上;新浪微博某一时期也可能大家广泛关注的主题也是少部分事件 。
总的来说就是用户只用到了总数据条目的一小部分,当网站发展到一定规模,数据库IO操作成为性能瓶颈的时候,使用缓存将这一小部分的热门数据缓存在内存中是一个很不错的选择,不但可以减轻数据库的压力,还可以提高整体网站的数据访问速度 。
使用缓存的方式可以通过程序代码将数据直接保存到内存中,例如通过使用Map或者ConcurrentHashMap;另一种,就是使用缓存框架:redis、Ehcache、Memcache等 。使用缓存框架的时候,我们需要关心的就是什么时候创建缓存和缓存失效策略 。
注意:使用缓存的时候还要考虑到缓存服务器发生故障时候如何进行容错处理,是使用N多台服务器缓存相同的数据,通过分布式部署的方式对缓存数据进行控制,当一台发生故障的时候自动切换到其他的机器上去;还是通过Hash一致性的方式,等待缓存服务器恢复正常使用的时候重新指定到该缓存服务器 。Hash一致性的另一个作用就是在分布式缓存服务器下对数据进行定位,将数据分布在不用缓存服务器上 。
二、页面静态化技术使用传统的JSP界面,前端界面的显示是通过后台服务器进行渲染后返回给前端游览器进行解析执行 。现在提倡前后端分离,前端界面基本都是HTML网页代码,通过Angular JS或者NodeJS提供的路由向后端服务器发出请求获取数据,然后在游览器对数据进行渲染,这样在很大程度上降低了后端服务器的压力 。还可以将这些静态的HTML、css、JS、图片资源等放置在缓存服务器上或者CDN服务器上,一般使用最多的应该是CDN服务器或者Nginx服务器提供的静态资源功能 。
优化前端应该遵循以下几点:
  1. 尽量减少HTTP请求 。
  2. 使用cdn(Content Delivery Network,即内容分发网络) 。
  3. 添加expire头,控制缓存的失效日期 。
  4. 采用Gzip压缩组件 。
  5. 将样式表放在头部 。
  6. 将脚本放在底部 。
  7. 避免使用css表达式 。
  8. 使用外部的JAVAScript和css 。
  9. 减少DNS查询 。
  10. 精简JavaScript 。
  11. 避免重定向 。
  12. 使用ajax可以缓存 。
三、数据库优化大多数网站性能的瓶颈都是开在数据库IO操作上 。对于数据库的优化来说,是一种用技术换金钱的方式 。数据库优化的方式很多,常见的可以分为:
  1. 数据库表结构优化 。
  2. SQL语句优化 。
  3. 分区 。
  4. 分表 。
  5. 索引优化 。
  6. 使用存储过程代替直接操作 。
1、表结构优化
1.1、命名规范
1.库名、表名、字段名必须使用小写字母,并采用下划线分割 。
  • MySQL有配置参数lower_case_table_names,不可动态更改,linux系统默认为 0,即库表名以实际情况存储,大小写敏感 。如果是1,以小写存储,大小写不敏感 。如果是2,以实际情况存储,但以小写比较 。
  • 如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱 。
  • 字段名显示区分大小写,但实际使?用不区分,即不可以建立两个名字一样但大小写不一样的字段 。
  • 为了统一规范,库名、表名、字段名使用小写字母 。
2、库名、表名、字段名禁止超过32个字符
库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符 。
3、使用INNODB引擎 。
INNODB引擎是MySQL5.5版本以后的默认引擘,支持事务、行级锁,有更好的数据恢复能力、更好的并发性能,同时对多核、大内存、SSD等硬件支持更好,支持数据热备份等,因此INNODB相比MyISAM有明显优势 。
  1. InnoDB支持事务,MyISAM不支持 。
  2. InnoDB支持行级锁,MyISAM支持表级锁 。


    推荐阅读