大规模分布式网站开发设计所需知识整理
要设计开发大规模分布式网站,首先需要掌握开发一个基本规模网站的相关知识。
知识技能分三类,一类为开发所需,一类为运维部署所需,一类为设计所需。
一、开发所需知识
一般采用三层架构来完成网站系统的设计,因此开发所需的知识端包括:
1、表现层:目前常用的表现层工具,无疑义的是JQuery以及类似的Javascript框架,比如ReactJS、AngularJS等,HTML5;Structs2是否还流行,或者采用SpringMVC,看起来Structs已经不是主流工具了。这是直接使用的,往下最好还掌握一些更基础的技术,比如原生Javascript、HTML、Ajax、CSS等。
2、业务层:毫无疑问,Spring是当前最流行的框架;
3、数据层:Hebernate、iBatis,Hebernate比较老牌,目前iBatic变得比较流行;
4、通用技术背景知识:Http协议、MySQL、Oracle、TCP/IP
二、设计所需知识:面向对象(包括分析、设计、编码)、MVC思路、AOP、设计模式及反模式
三、运维部署所需:Jboss/Tomcat等应用服务器的安装、配置、使用,Shell/Python脚本的编写,Linux基础知识(包括安装配置、基础使用)
有了以上知识,基本就可以设计、开发并运维一个基本规模的网站系统了,随着规模的扩大,需要对上述架构做修改,具体而言,可从以下几个方面理解:
1、业务逻辑变复杂:业务逻辑变复杂,带来的问题主要问题是对系统的掌握难度变高,开发人员需要掌握全部业务逻辑才可以较好的对系统进行变更,因此需要将所有业务逻辑集中在一个应用中的集中式架构拆分出来,按照业务划分子系统,每个子系统一个应用,形成垂直架构;然后发现各个垂直子系统有很多功能是重复的,因此进一步拆分为分布式系统架构(也称之为面向服务的架构SOA),按照对外提供功能的不同,将系统划分为多层、多模块的结构,最上层是直接提供最终用户功能的,往下可包含一层或多层,提供抽象粒度不同、复用程度不同的基础公共功能模块。 除了降低开发难度外,这种分布式架构还会带额外好处,例如可以对某个重要功能做集群和高可用,可以针对某个具体的应用或者服务的特点来配置适合的硬件等等,按时降低开发难度应该是最主要的。
业务分布式系统架构也会引入新的问题,最主要的是各个分布式服务之间的通信问题,解决办法:同步通信构建一个服务注册中心,所有服务启动时将自身注册到该中心,需要使用某个服务时从该中心获取可用服务地址列表,阿里、京东等一般都会开发自己的服务注册中心,其第一个版本均基于Zookeeper来开发;异步通信使用消息中间件,例如ActiveMQ、RabbitMQ等。
2、并发变高:从两个方面解决这个问题:
(1)优化单台服务器性能:需要掌握Linux调优,充分发挥机器性能;并熟悉硬件的进步,比如SSD、PCI-E等的特性;
(2)使系统具备水平扩展能力:采用LVS、Nginx等构建集群;引入缓存,例如Memcache、Redis等,数据规模比较大需要“分布式”的使用这些缓存
3、数据规模变大:
(1)扩充传统关系型存储,使之变为集群:MySQL集群,包括读写分离、按业务分离、分库和分表,其中分库分表又会带来无法有效支持复杂查询(例如关联多表查询)的问题,引入搜索引擎以及统一的数据访问层来解决这个问题,搜索引擎例如Lucenu,数据访问层例如淘宝的TDDL。
(2)引入NoSQL存储:例如HBase、Redis集群等;
(3)引入分布式存储:例如HDFS、FastDFS等,或者结合自身业务特点开发自身的分布式存储系统,例如淘宝的TFS
4、运维变复杂:
解决这个问题主要靠自动化运维系统,完成整个分布式系统的自动监控、以及各种事件处理,例如某业务压力过大时自动调度闲置资源来增加该业务的服务能力,例如故障时自动专一等,为了使得自动化运维系统变得简单,一般会使用虚拟机技术,例如OpenStack、VMware等,这些虚拟机又会带来性能的额外损耗,因此又有了Docker。