我为什么读这本书?
最近在研究分布式相关,在网上聊的热火朝天,都说这本书入门好。李智慧编写,电子工业出版社出版,
豆瓣读书评分是7.9,一共有1000多人参与评论。我大概花了一个多星期的零碎时间,通读了这本书,大
概读到后面的后辈对晚辈的悉心嘱咐的时候,我就在豆瓣读书奉献了这本书的书评,给了三星。并作了
一些评论。毫无疑问,这本书真的是很适合入门,网上的兄弟们没骗我,它会在大型网站架构上给你一
些很全面的认识以及自己的一些经验之谈。但咋们做技术的,往往注重实用性,关注点在能不能用,怎
么用,用的时候注意什么,用的好不好等问题,但在这本书并没有深入。而最后,我想总结的是,这本
书更像一本兵书,想发力却又用不上来的那种感觉,又像师父领进门,修行看个人的感觉。如果说非要
给这本书来个标签,那可能是,有点失灵,但方向还基本正确的指南针,因为里面多少掺杂一些水分,
无关紧要的,能一句话说完,它非要说上1000来字,带点装*,自嗨的那种感觉。
这本书带给我的收获
一般后台的分三层:应用层,服务层,数据层。应用层一般是页面及控制器。服务层是一些可调用的接
口,可以理解成service层,而数据库层,也就是操作数据库的,可以理解成dao层。但这仅仅指的是java
层面上的理解。
先说应用层,也就是页面相关的。
流量入口,我们一般用nginx进行反向代理,负载均衡。将请求按轮询的方式或者hash方式分发到具体的
服务器或者网关。一些热点的静态页面(比如说主页)可以放到nginx缓存或者CDN服务器。而CDN、反向
代理服务器的原理都是缓存。当然,如果集群中的某一台服务器宕机了,要实现失效转移,将请求转发
到其他正常运行的服务器中。
1、页面优化
为减少http请求,我们要实现一个静态资源,合并css,js,以及请求数据量大的图片。其次,要通过设置
请求头的方式实现浏览器缓存,304重定向,防止图片,js的文件的再次加载。其次可以启用压缩,服务
器将文件压缩,浏览器解压缩。减少传输的数据量。其次css放在上面,js放在下面。因为加载页面
是从上往下加载的。
2、负载均衡
有几种方式,反向代理负载均衡,IP负载均衡,数据链路层负载均衡等。这些之后可以去了解一下,这
几种都是不同的。这本书也描述的不是特别清楚。然后以及负载均衡的算法,现在业内大部分是通过
一致性hash算法来实现请求到底去选择哪一台服务器。
然后说说服务层
当服务层的关系很复杂的时候,我们要对其进行解耦,解耦的方式有以下那么几种:
分布式服务:也就是rpc,远程方法调用,国内的Dubbo或者FaceBook通过Thrift来自主研发的框架。
原理简单:网络通信+编解码+服务端+客户端。
消息队列:消息队列是类似于生产者-消费者模式的。一头生产消息,另一头消费消息,中间来个管理消
息与推送消息的。也常常叫做消息中间件,jms。如:activemq,kafka等。在高并发支付场景可以使用。
但注意幂等性,消息重发等问题。独立部署web应用:当某一个服务与其他服务关联不大的时候,可以采
用单独拿出来,独立部署。
最后是数据层
关系型数据库往往会设计成读写分离(master写,一个或多个slave读)的模式。如mysql本身有主从热备
的功能,也就是数据库之间数据同步。先说下概念,热备份是主从复制,而冷备份定期存档。其次还有垂直水
平分库分表的方式,按业务模块分,按列,按时间等分出多个数据库或表。性能上,人为能改变的有sql优化、
索引设置等。然后是nosql相关的,nosql种类很多,如key-value形式,可用于存session,保证session
一致性的redis,文档型非关系型数据库mongoDB,此外还有mamcached等。
然后介绍几个概念,
缓存预热:将数据提前存到非关系型数据库如redis中,防止项目重新部署之后,关系型数据库如mysql访问
量过大而宕机。
缓存穿透:是指大量并发访问redis中一个不存在的数据,导致请求都往mysql上串,最终mysql访问量过大
而宕机,解决的方式可以是设置将redis不存在的数据立即返回null。
自动化
自动化是我们的理想形态,如:自动化发布、自动化代码管理、自动化测试(安全、性能、功能),自动化
监控和报警(心跳检测、通知),自动化失效转移,超时转移和失效恢复、自动化降级、自动化分配资源等。
大型网站要实现以下几种性质
可用性:一年内99.99%的时间里,服务器都能正常的运行及可提供功能访问。
伸缩性:线上增减服务器数量时对其它服务器的影响。
扩展性:增减功能对其他功能的影响。
安全性:保证网站的安全。
CAP原理
C:数据一致性,保证请求在某一具体功能点上都能访问到相同或者说正确的数据。
A:数据可用性:任何时候请求的数据都能进行读写访问。
P:系统跨网络线性伸缩。
灰度发布
每天只发布部分服务器,分多天发布。
无状态
集群服务器之后,请求过来后,访问那一台服务器是具有不确定性的。
秒杀系统的架构和设计
1、秒杀系统独立部署,与网站其他功能尽量没有关联,秒杀商品页面静态化,用户请求不需要经过应用服务
器进行跳转或者逻辑处理,秒杀页面租借秒杀活动网络带宽,将秒杀商品页面缓存到CDN中。
2、部署定时任务服务器,动态生成随机下单页面的URL,推送到javascript服务器中,到点后,静态页面刷
新,购买按钮点亮。
3、设置全局计数器服务器,每次下单前都要取缓存中的数字进行比对,如果大于缓存中的数字,则直接返
回活动结束页面,否则提交到订单处理子系统。
其他
服务器配置实时更新之后的分布式配置,如用zookeeper共享配置。
分布式环境下实现并发访问协同的分布式锁。
分布式批量操作等。