随着公司业务的拓展,随之而来就是各类系统横向和纵向的增长,PV、UV也都随之增长,原有的系统架构和模式慢慢赶上了瓶颈,须要逐步的对系统从总体上进行改造升级,经过一段时间的整理思路,作一个简单的总结与分享。同时因为能力等方面的不足,若是有什么说的很差之处,还请各位大神多多指点。css
本次调整提示主要从如下几个点进行入手html
项目架构改进,主线就是面向微服务化。主要思路是:先后端分离、业务系统与管理系统横向拆分、服务接口根据业务流向进行横向拆分、服务接口根据功能单元进行纵向分层。前端
系统分割的总体架构及其组成单元,以及其各个单元间的数据交互关系以下图:web
先后端分离,通俗的说就是:将界面显示和后端业务逻辑处理分割成独立的项目,分割后,两种的数据交互是,前端经过ajax调用后端暴露的数据交互接口,数据交互格式采用(json)。ajax
先后端分离可以起到很好的先后端解耦,各自分工,提升开发效率,提升代码的复用性,便于资源的横向扩展部署。数据库
系统横向拆分,主要是只,根据不一样的业务角色,独立搭建对应的UI系统,避免一个平台大单点站点,只要一个模块出问题,致使整个系统平台都不能使用。系统拆分后,不一样的系统独立部署,互不影响。这样适当系统职责功能单一,便于后期维护和管理,同时可以提升平台的总体可用性。json
好比,系统横向可拆分为:平台总后台管理系统、合做商管理后台、店铺管理后台、PC商城、H5商城、APP。后端
接口横向拆分:横向拆分,主要是指根据不一样的功能模块将取拆分为独立的服务。通常拆分标准,是按照大的功能模块点来拆分。好比:商品、订单、帐单、用户、公共数据。缓存
这样拆分的好处是:单点项目功能职责单一便于后期维护管理;不一样服务独立部署,互不影响,提升系统的可用性;资源部署,可根据服务使用频率动态增长单点的硬件资源,提升资源的利用率。服务器
接口纵向分割:这个就是软件上的一个分层思想,其做用主要表如今:
数据交互上的改进主要采用多级缓存+消息队列机制,来提升相应效率,同时也能提升系统的吞吐量和并发数。下面将简要说明缓存及其消息队列的使用机制。
多级缓存效果图,借用一张博客园的图,以为解释的很到位,以下:
客户端缓存:客户端缓存主要缓存用户的登陆状态消息,非敏感、变动频率及其小、使用频换(入地理位置信息)。
因为客户端缓存在相应速度是最快的方式,可是也会有一个很致命的缺点,若是须要强制清理缓存比较麻烦,服务器端提供一个接口配置强制清缓存策略,这样可以提升客户端缓存的可控性。
服务器缓存:服务器缓存主要存储一些登陆用户相关信息,以及配置信息等。
分布式缓存:分布式缓存主要用于缓存一些变化频率低的数据,好比:商品信息、店铺信息等等。
运维级缓存:运维缓存主要缓存一些文件资源,如js、css、html等,这样用户可以快速的获取到资源信息。
消息队列:使用消息队列异步处理用户请求,可以将用户请求和逻辑操做解耦,提升用户相应速度。
数据存储的主要改进方案是:数据库读写分离+主从备份,纵向分表+横向分区存储
根据业务线和功能模块横向分库、在具体表上,根据实际业务采用横向拆表纵向分表存储
业务线和功能模块横向分库:好比,订单数据、帐单数据、商品相关的数据,采用独立的库存储
横向拆表:主要是针对数据量比较大的表,按照某一规则,分表存储(是否分表的规则是保持单标数据不要超出百万),
好比订单表,因为数据量比较大,能够按照月分表;用户表能够按照哈希分表存储。
纵向分表:主要是针对表字段比较多的表,拆分为多表存储,通常拆分规则为:
对于一张表若是业务上分两次访问某一张表其中一部分数据,那么就能够根据每次访问列的不一样来作拆分;
另外还能够根据列更新的频率来拆分,例如某些列天天要更新3次,有些列从建立开始基本上不多更新。
经过先后端分离+系统拆分:独立部署,提升系统的可以使用性,提升资源的使用效率
经过多级缓存+消息队列:提升系统相应时间、系统的吞吐量、并发数
数据库读写分离+主从备份,纵向分表+横向分区存储:提升数据库的处理效率,和下降处理压力。
原文出处:https://www.cnblogs.com/xiaoXuZhi/p/web_Framework_Design.html