前言:前段时间刚泛读了一遍《大型网站系统与Java中间件实践》一书,感觉这书无论广度和深度都非常出色,现在重新精读一遍,并整理一遍读书笔记,以此来更好的学习里面的内容。
- 关于分布式系统
- 分布式系统的定义
- 分布在网络计算机上
- 组件之间仅仅通过消息传递来通信并协调行动
- 分布式系统的定义
-
- 使用分布式分布式系统的原因
- 升级单机处理能力的性价比越来越低
- 单机处理能力存在瓶颈
- 出于稳定性和可用性的考虑
-
- 相关知识
- 阿姆达尔定律告诉我们,程序中可并行代码的比例决定了增加处理器(总核心数)所能带来的速度提升的上线。(也就是说,除了增加CPU的性能外,使用多线程编程也是提升系统速度必不可少的一个因素)
- 分布式系统是由多机组成的系统,可以近似的看做是把单机多进程变为了多机的多进程
- 网络IO实现方式:BIO、NIO(Reactor反应器模式)、AIO(Proactor前摄模式),阻塞、异步的区别
- 分布式系统中常用模式:硬件负载均衡、LVS、名称服务、规则服务器、MasterWorker方式,常用于控制器、运算器和储存器中
- 分布式系统的难点:缺乏全局时钟、面对故障独立性、处理单点故障、事务的挑战。
- 大型网站及其架构演进过程
- 什么是大型网站:支撑海量数据和非常高的并发的访问量,必定是一个分布式系统。
-
- 大型网站的架构演进
- 单机上的功能模块拆分
- 数据库与应用分类
- 单机应用服务器改为集群:引入负载均衡设备、session问题的4种处理方式
- 数据读写分离:搜索引擎其实是一个读库,缓存是加速数据读取的利器(高并发)
- 引入分布式储存系统:分布式文件系统、分布式key-value系统和风不是数据库(高效率)
- 数据库垂直拆分和水平拆分(大数据)
- 拆分应用走服务化的路,需要基础组件的支持,比如:利用消息中间件来异步和解耦。
- 构建Java中间件
- 中间件的定义:提供了操作系统所提供的服务之外的服务,相当于“软件胶水”
- 三个领域的应用:
- 远程调用和对象访问中间件:解决分布式环境下应用互相访问的问题
- 消息中间件:解决应用之间的消息传递、解耦、异步的问题
- 数据访问中间件:解决应用访问数据库的共性问题的组件
- Java中间件的相关知识:JVM、GC、并发编程、动态代理、反射、网络通信
- 中间件的作用:在网站的演进过程中,一些非常重要的变化包括应用的拆分、服务的拆分、数据的拆分和应用的解耦。而在大型网站中要具体完成这样的工作,就需要对应的中间件产品来对应和解决相应的问题。
- 服务框架
- 网站功能持续丰富后的困境与应对
- 应用拆小,但是公用数据库缓存等模块。这样做在小范围实现的成本较低,但是继续下去数据库等模块压力会变大,代码和应用也冗余越重。
- 服务化方案,能让多个规模不大的团队,专注在某个具体的服务或者应用上,以这种方式来应对和解决问题。
- 网站功能持续丰富后的困境与应对
-
- 服务框架的设计与实现
- 如何配置
- 运行期间服务框架与应用和容器的关系:将其部署为一个SAR包来为应用提供服务。
- 通信方式的选择
- 服务端的设计与实现
- 实战中的优化
- 服务治理
- 数据访问层
- 数据库从单机到分布式的挑战和应对
- 1.单机数据库
- 2.数据库垂直/水平拆分
- 数据库从单机到分布式的挑战和应对
- 关于数据库减压
- 优化应用,看看是否有不必要的压力给力数据库(应用优化);
- 看看有没有其他的办法可以降低对数据库的压力,例如引入缓存、加搜索引擎等;
- 把数据库和访问分到多台数据库上,分开支持
- 大型网站的一致性的基础理论——CAP/BASE
- 数据访问层的设计与实现
- 消息中间件
- 消息中间件的价值:消息中间件为分布式系统带来了异步的特效,对系统进行了解耦
- B/S系统下的消息中间件
- 软件负责中心与集中配置管理
- 负载中间的职责:
1.聚合地址信息
2.生命周期的感知(服务器的上下线) - 负载中心的结构:分服务端和客户端
- 从单机到集群
- 集中配置管理中心
- 负载中间的职责:
- 构建大型网站的其它要素
- 加速静态内容访问速度的CDN——内容分发网络
- 大型网站的存储支持:分布式文件系统(TFS)、NoSQL
- 缓存系统:一般的做法是在写数据时更新存储,然后失效缓存数据;而在读数据时首先读缓存,如果没有命中,再去读存储,并且把数据写入缓存。
- 搜索系统:爬虫问题、倒排索引
- 数据计算支持:
- 数据计算支撑:离线计算、在线计算
- 发布系统
- 应用监控系统
- 依赖管理系统
- 多机房问题
- 系统容量规划
- 内部私有云
后记:在大型网站的建设中,千万不要一味遵循一些所谓的标准,因为有些标准的指定根本不是针对大型网站系统的