交易系统设计原则
高并发原则
无状态:应用无状态,配置文件有状态。应用要支持水平扩展
拆分:大型系统设计时,要按照功能模块进行拆分,有以下几个维度
服务化:服务独立部署,避免相互影响;进程内服务 -> 单机远程服务 -> 集群手动注册服务 -> 自动注册和发现服务 -> 服务的分组/隔离/路由 -> 服务治理
消息队列:使用消息队列进行服务解耦,可做大流量缓冲,但是要考虑数据校对问题
缓存:
浏览器缓存:可用于对实时性要求较低的数据,例如静态文件、广告等等
APP客户端缓存:防止大促瞬间流量冲刷,可以提前把一些静态文件下发缓存
CDN缓存:利用CDN节点为用户推送数据;
- 推送机制:内容节点变更后,推送到CDN边缘节点;
- 拉取机制:先访问边缘节点,当没有内容时,回源到源服务节点拿取内容并缓存到CDN边缘节点。在设计URL时要注意不要有随机数,这样每次都会穿透CDN回源到源服务器,相当于CDN没有作用。
接入层缓存:
- URL重写:按照规定的设计格式、顺序重写,避免随机数
- 一致性哈希:按照指定的参数做一致性哈希,保证相同的数据落到同一台服务器上
- proxy_cache:使用内存 / SSD 级代理缓存来缓存内容
- proxy_cache_lock:使用 lock 机制,将多个回源合并为一个,减少回源量
- shared_dict:如果架构使用 Nginx+Lua 实现,可以考虑使用 Lua shard_dict 进行缓存,最大的好处就是reload缓存不会丢失。Nginx + Lua参考
应用层缓存:堆内缓存、堆外缓存
分布式缓存:部署分布式缓存集群
并发化:非依赖服务并发请求
高可用原则
- 降级
- 开关集中化管理:通过推送机制把开关推送到各个应用
- 可降级的多级读服务:服务降级为只读本地缓存、只读分布式缓存、只读默认降级数据
- 开关前置化:在 Nginx 层做开关,请求流量不回源到后端服务器
- 业务降级:当高并发流量来袭,为保证主服务,将部分同步服务改为异步,优先处理高优先级数据或特殊特征数据,合理分配进入系统的流量,最终要保持数据一致性。
- 限流:做好防火墙
- 恶意请求只访问到 cache
- 恶意 IP 拦截
- 使用 Nginx 的 limit 模块处理,避免流量超出系统峰值
- 切流量:某机房瘫痪切换流量到其他机房
- DNS:切换机房入口
- HttpDNS:客户端分配好流量入口,绕过运营商LocalDNS并实现高精准的流量调度
- LVS / HsProxy:切换故障的Nginx接入层
- Nginx:切换故障的应用接入层
- 可回滚
业务设计原则
- 防重设计
- 幂等设计
- 流程可定义
- 状态与状态机
- 后台系统操作可反馈
- 后台系统审批化
- 文档和注释
- 备份