交易系统设计原则

高并发原则

  • 无状态:应用无状态,配置文件有状态。应用要支持水平扩展

  • 拆分:大型系统设计时,要按照功能模块进行拆分,有以下几个维度

    1. 系统维度:按照系统功能/业务拆分
    2. 功能维度:对一个系统进行功能再拆分
    3. 读写维度:根据读写比例特征进行拆分(读服务考虑使用缓存,写入量大考虑使用分库分表)
    4. AOP维度:根据访问特征,进行AOP拆分
    5. 模块维度:按照基础或者代码模块拆分,基础模块分库分表、数据库连接池;代码结构按照三层(Web、Service、DAO)
  • 服务化:服务独立部署,避免相互影响;进程内服务 -> 单机远程服务 -> 集群手动注册服务 -> 自动注册和发现服务 -> 服务的分组/隔离/路由 -> 服务治理

  • 消息队列:使用消息队列进行服务解耦,可做大流量缓冲,但是要考虑数据校对问题

    1. 数据异构:
    2. 数据聚合:数据异构把数据从多个数据源拿过来,在做聚合给前端
    3. 前段展示:可通过一个或少量几个请求获取数据
  • 缓存

    1. 浏览器缓存:可用于对实时性要求较低的数据,例如静态文件、广告等等
    2. APP客户端缓存:防止大促瞬间流量冲刷,可以提前把一些静态文件下发缓存
    3. CDN缓存:利用CDN节点为用户推送数据;
      • 推送机制:内容节点变更后,推送到CDN边缘节点;
      • 拉取机制:先访问边缘节点,当没有内容时,回源到源服务节点拿取内容并缓存到CDN边缘节点。在设计URL时要注意不要有随机数,这样每次都会穿透CDN回源到源服务器,相当于CDN没有作用。
    4. 接入层缓存:
      • URL重写:按照规定的设计格式、顺序重写,避免随机数
      • 一致性哈希:按照指定的参数做一致性哈希,保证相同的数据落到同一台服务器上
      • proxy_cache:使用内存 / SSD 级代理缓存来缓存内容
      • proxy_cache_lock:使用 lock 机制,将多个回源合并为一个,减少回源量
      • shared_dict:如果架构使用 Nginx+Lua 实现,可以考虑使用 Lua shard_dict 进行缓存,最大的好处就是reload缓存不会丢失。Nginx + Lua参考
    5. 应用层缓存:堆内缓存、堆外缓存
    6. 分布式缓存:部署分布式缓存集群
  • 并发化:非依赖服务并发请求

高可用原则

  • 降级
    1. 开关集中化管理:通过推送机制把开关推送到各个应用
    2. 可降级的多级读服务:服务降级为只读本地缓存、只读分布式缓存、只读默认降级数据
    3. 开关前置化:在 Nginx 层做开关,请求流量不回源到后端服务器
    4. 业务降级:当高并发流量来袭,为保证主服务,将部分同步服务改为异步,优先处理高优先级数据或特殊特征数据,合理分配进入系统的流量,最终要保持数据一致性。
  • 限流:做好防火墙
    1. 恶意请求只访问到 cache
    2. 恶意 IP 拦截
    3. 使用 Nginx 的 limit 模块处理,避免流量超出系统峰值
  • 切流量:某机房瘫痪切换流量到其他机房
    1. DNS:切换机房入口
    2. HttpDNS:客户端分配好流量入口,绕过运营商LocalDNS并实现高精准的流量调度
    3. LVS / HsProxy:切换故障的Nginx接入层
    4. Nginx:切换故障的应用接入层
  • 可回滚

业务设计原则

  • 防重设计
  • 幂等设计
  • 流程可定义
  • 状态与状态机
  • 后台系统操作可反馈
  • 后台系统审批化
  • 文档和注释
  • 备份