一、高并发的设计原则
- 无状态:应用无状态,配置文件有状态。例如通过不同的配置文件来连接不同的数据库;
- 拆分:一般按照功能模块进行拆分,这个要按照环境进行权衡,这也是一种隔离。拆分的几个情况:
- 系统维度:按照系统功能/业务拆分,比如:商品系统,购物车,结算,订单系统等。
- 功能维度:对系统进行功能拆分,比如,优惠券系统可以拆分为后台优惠券创建、领劵系统、用卷系统等。
- 读写维度:根据读写比例进行拆分;读系统可以用缓存提升性能,写的量大时,可以考虑分库分表。
- AOP维度:根据访问特征,按照AOP进行拆分,比如,商品详情可以分为CDN、页面渲染系统;CDN就是一个AOP系统。
- 模块维度:按照基础和代码维护特征进行拆分。
- 服务化:首先,判断单体服务还是集群服务,其次服务分组/隔离,后期要考虑限流和白名单。
- 消息队列:用来解耦一些不需要同步的,或者订阅一些系统关心的变化;注意:消息失败,或者重复接收的场景。
- 缓存:缓存可以提高系统的性能。
- 并发化:改串行为并行,通过并发化来提高系统的性能。
二、高可用原则
- 降级:
1、开关集中化降级,
2、可降级的多级服务,
3、开关前置化,
4、业务优先级降级
- 限流:目的是防止恶意请求流量,恶意攻击、或者防止流量超出系统峰值。
- 切流量:
1、DNS: 切换机房入口;
2、HttpsDNS:主要是APP场景,客户端分配好流量入口;
3、LVS/HaProoxy:切换故障的Nginx接入层;
4、Nginx:切换故障的应用层
- 可回滚:例如事务回滚、代码回滚等
三、业务设计原则
- 防重设计:例如重复提交,下单重复扣减库存;解决方案:对单个用户限流、防重 key、防重表。
- 幂等性设计:业务中重复消息消费时进行幂等处理。
- 状态与状态机:设计交易系统会存在正向状态和逆向状态等,正向和逆向状态应该根据系统的特征来考虑是否分离存储。状态设计时应有状态轨迹,方便跟踪和回溯订单。
- 后台系统操作反馈:修改某些内容想看最终效果,设计后台要考虑效果可预览、可反馈。
- 后台系统审批化:对于重要的后台功能需要设计审批流程。例如,修改价格,并对操作日志进行记录,保证可追溯、可审计。
- 文档和注释:系统没有文档和注释,完全人传人。后来接手的人完全不敢动。
- 备份:备份可以方便留档,出错也方便恢复。