墨菲定律

1 任何事都没有表面看起来那么简单

2 所有的事都会比你预计的时间长

3 可能出错的事总会出错

4 如果你担心某种情况发生,那么它就更有可能发生

康威定律

1 系统架构是公司组织架构的反映

2 应该按照业务闭环进行系统拆分/组织架构划分,实现闭环/高内聚/低耦合,减少沟通成本

3 如果沟通出现问题,那么就应该考虑进行系统和组织架构的调整

4 在适合时机进行系统拆分,不要一开始就把系统/服务拆得非常细,虽然闭环,但是每个人维护的系统多,维护成本高

 

 

 

 

高并发原则

1 无状态

  如果设计的应用是无状态的,那么比较容易进行水平扩展。实际中可能是:应用无状态,配置文件有状态

2 拆分

  系统维度:按照系统功能/业务拆分,比如商品系统,购物车,结算,订单系统等

  功能维度:对一个系统进行功能再拆分,比如优惠券系统可以拆分为后台券创建系统,领券系统,用券系统等

  读写维度:根据读写比例特征进行拆分,

  AOP维度:根据访问特征,按照AOP进行拆分。比如商品详情页可以分为CDN,页面渲染系统,CDN就是一个AOP系统

  模块维度:比如基础模块分库分表,数据库连接池等

3 服务化

  进程内服务->单机远程服务->集群手动注册服务->自动注册和发现服务->服务的分组/隔离/路由->服务治理如限流/黑白名单

4 消息队列

  解耦一些不需要同步调用的服务或订阅一些自己系统关心的变化。使用消息队列可以实现服务解耦,异步处理,流量削峰/缓冲

5 数据异构

  实现数据的自我控制,当其他系统出问题时,不影响自己的系统

6 缓存银弹

  浏览器端缓存:设置请求的过期时间,适合对实时性不太敏感的数据,不适合价格,库存等实时要求高的数据

  app客户端缓存:

  CDN缓存:

  接入层缓存:在nginx搭建一层接入层

  应用层缓存:使用tomcat时,使用堆内缓存/堆外缓存。local redis cache,在应用所在服务器部署一组redis,直接读取本机redis,redis间主从同步,这样没有网络消耗,性能最优

  分布式缓存:数据量太大,单服务器存储不了,可以使用分片机制的redis集群

7 并发化

  

 

 

 

高可用原则

1 降级

  降级开关。

  开关集中化管理:推送开关到各个应用

  可降级的多级读:降级为只读本地缓存,只读分布式缓存等

  开关前置化:开关前置到nginx接入层

  业务降级:同步改异步,优先处理高级别数据

2 限流

  防止恶意请求流量,恶意攻击,流量超出系统峰值

  恶意请求流量只访问到cache

  使用nginx的limit模块

  nginx的deny屏蔽

3 切流量

  DNS:切换机房入口

  HttpDNS:主要是APP场景下,在客户端分配好流量入口

  LVS/HaProxy:切换故障的nginx接入层

  NGINX:切换故障的应用层

4 可回滚

  版本化。事务回滚,代码回滚,部署回滚,数据回滚,静态资源回滚

 

 

 

 

业务设计原则

1 防重设计

  防重key,防重表

2 幂等设计

3 流程可定义

4 状态与状态机

5 后台系统操作可反馈

6 后台系统审批化

7 文档和注释

8 备份