墨菲定律:
- 任何事情都没有表面看起来那么简单
- 所有的事情都会比你预计的时间长
- 可能出错的事总会出错
- 如果你担心某种情况发生,那么他就更有可能发生
高并发原则
无状态
如果设计的应用是无状态的,那么应用比较容易进行水平扩展。
拆分
根据具体情况权衡,是设计一个大而全的系统还是按功能模块拆分系统。
服务化
进程内服务->单机远程服务->集群手动注册服务->自动注册和发现服务->服务的分组、隔离、路由->服务治理如限流、黑白名单
消息队列
数据异构
- 数据异构
- 数据闭环
缓存银弹
缓存对于读服务来说可谓抗流量的银弹。
- 浏览器端缓存:适用于对实时性不太敏感的数据
- APP客户端缓存:素材提前下发到客户端缓存;离线地图
- CDN缓存:一种是推送机制(当内容变更后主动推送到CDN边缘节点),一种是拉取机制(先访问边缘节点,当没有内容时,回源到服务器拿到内容并存储到节点上)。URL中不能 有随机数
- 接入层缓存:url重写,一致性哈希,proxy_cache,proxy_cache_lock,shared_dict
- 应用层缓存
- 分布式缓存
并发化
高可用原则
降级
限流
主要目的是防止恶意请求流量、恶意攻击,或者防止流量超出系统峰值。
- 恶意请求流量只访问到cache
- 对于穿透到后端的流量可以考虑使用Nginx的limit模块处理
- 对于恶意IP可以使用nginx deny进行屏蔽
原则是限制流量穿透到后端薄弱的应用层
切流量
对于一个大型应用,切流量是非常重要的,比如多机房环境下某个机房挂了,或者某个机架挂了,或则某台服务器挂了,都需要切流量。
- DNS:切换机放入口
- HttpDNS:主要APP场景下,在客户端分配好流量入口
- LVS/HaProxy:切换故障的nginx接入层
- Nginx:切换故障的应用层
可回滚
业务设计原则
防重设计
考虑重复提交,防止重复扣减库存等
幂等设计
流程可定义
状态与状态机
后台系统操作可反馈
后台系统审批化
操作可追溯、可审计
文档和注释
系统发展的一开始就有文档库(设计架构、设计思想、数据字典/业务流程、现有问题),业务代码和特殊需求都要有注释。