Skip to content

架构和设计

架构设计-一些数据和高并发高性能解决之道

  • 计算机系统中的数据读取延迟 - CPU
    1. 一级缓存读取 0.5ns
    2. 分支预测 5ns
    3. 二级缓存读取 7ns
    4. 互斥锁和解锁 100ns
  • 计算机系统中的数据读取延迟 - 内存

    1. 主内存读取 100ns
    2. 用zip压缩1K字节的数据 10000ns 0.01ms
    3. 从主内存中顺序读1MB数据 25000ns 0.25ms
  • 计算机系统中的数据读取延迟 - 网络

    1. 在1Gbps网络上发送1K数据 10000ns 0.01ms
    2. 统一数据中心的往返时间 500000ns 0.5ms
    3. 从网络上顺序读取1M数据 10000000ns 10ms
    4. 发送一个包从加州-荷兰-加州 150000000ns 150ms
  • 计算机系统中的数据读取延迟 - 硬盘

    1. 从SSD硬盘随机读取4K数据 150000ns 0.15ms
    2. 从SSD硬盘顺序读取1MB数据 1000000ns 1ms
      1. 4倍的内存时间
    3. Disk seek磁盘寻道时间 10000000ns 10ms
    4. 从磁盘上顺序读取1M数据 20000000ns 20ms 80x memory 20X SSD
      1. 80倍的内存
      2. 20倍SSD
  • 并发性能架构的关键

    1. 内存 > 分布式内存 > SSD > HDD
    2. 异步 > 同步
    3. 分布式 > 单机

架构设计-红包系统高性能解决之道

Image title

异步架构

Image title

数据库分片

架构设计-重点总结

  1. 红包系统的特点:事务安全和高并发
  2. 高并发高性能解决概述
    1. 数据就近访问
    2. 高性能存储
    3. 异步减少等待和缓冲
    4. 横向扩展:分布式集群
  3. 红包系统的一些高并发高性能解决思路
    1. 高效存取:分布式缓存和本地缓存
    2. 缓冲:消息队列异步化
    3. 数据层横向扩展能力:分片

架构设计-超卖方案1-事务锁方案

  • 行锁是一种悲观锁
    1. 适合写多和写冲突较多的场景
  • 行锁
    1. 优点
      1. 稳定可靠,不会出现超卖
    2. 缺点
      1. 需要查询和计算:性能差、锁阻塞等待
      2. 锁阻塞等待会导致客户端延迟或超时
      3. 重试增加系统和网络开销
  • 在数据库事务中锁定操作行的语句
    1. select * from t where id = ? from update;
  • 在数据库事务中通过程序来计算和判断
    1. remain = 扣减后的数量
    2. update t set remain = ? where id = ?;

架构设计-超卖方案2-无符号类型字段直接更新方案

  • 将剩余数量和金额字段类型设置为无符号整数
    1. 字段不能为负数
    2. 如果被减为小于0,SQL执行会报错

架构设计-超卖方案3-乐观锁方案概述

  • 假设数据不会被别人修改,只有自己,操作时验证一下
  • CAS:先比较,再更新
  • 适合写少和写冲突少的场景

架构设计-超卖方案3-乐观锁case语句方案

1
2
3
4
5
6
UPDATE a 
SET value = CASE case_value
    WHEN value >= 扣减数量或金额 THEN
        value - 扣减数量或金额
    ELSE value END CASE
WHERE id = ?;

架构设计-超卖方案3-乐观锁where条件方案

1
2
3
UPDATE a 
SET value = value - 扣减数量或金额
WHERE id = ? AND value >= 扣减数量或金额;

架构设计-超卖方案-性能比较和建议

Image title

方案性能比较

技术选型-验证框架

  • http://github.com/go-playground/validator
    1. 自称100分的验证框架
    2. struct 和 field 验证
      1. 包括交叉field、struct、Map、Slice and Array
    3. 支持自定义

技术选型-配置框架

  • http://github.com/tietang/props
    1. Key/Value 抽象,Unmarshal支持
    2. 多种配置源:本地文件和分布式配置源
    3. 组合配置源和上下文变量

技术选型-日志框架

  • http://github.com/sirupsen/logrus
    1. 结构化可插拔的标准日志工具
    2. 多种日志输出格式和自定义输出格式
    3. 支持自定义扩展 hook:定制,输出

技术选型-数据库工具

  • http://xorm.io
    1. 性能出色
    2. 功能足够
    3. 事务支持

技术选型-web服务框架

  • http://github.com/kataras/iris
    1. 性能出色
    2. 简单易用,强大的路由支持
    3. 自定义中间件扩展和丰富的中间件生态

技术选型-测试用例框架

  • http://github.com/smartystreets/goconvey
    1. go test集成,测试覆盖
    2. 自动化的 web UI
    3. 丰富的测试工具套件