架构和设计
架构设计-一些数据和高并发高性能解决之道
- 计算机系统中的数据读取延迟 - CPU
- 一级缓存读取 0.5ns
- 分支预测 5ns
- 二级缓存读取 7ns
- 互斥锁和解锁 100ns
-
计算机系统中的数据读取延迟 - 内存
- 主内存读取 100ns
- 用zip压缩1K字节的数据 10000ns 0.01ms
- 从主内存中顺序读1MB数据 25000ns 0.25ms
-
计算机系统中的数据读取延迟 - 网络
- 在1Gbps网络上发送1K数据 10000ns 0.01ms
- 统一数据中心的往返时间 500000ns 0.5ms
- 从网络上顺序读取1M数据 10000000ns 10ms
- 发送一个包从加州-荷兰-加州 150000000ns 150ms
-
计算机系统中的数据读取延迟 - 硬盘
- 从SSD硬盘随机读取4K数据 150000ns 0.15ms
- 从SSD硬盘顺序读取1MB数据 1000000ns 1ms
- 4倍的内存时间
- Disk seek磁盘寻道时间 10000000ns 10ms
- 从磁盘上顺序读取1M数据 20000000ns 20ms 80x memory 20X SSD
- 80倍的内存
- 20倍SSD
-
并发性能架构的关键
- 内存 > 分布式内存 > SSD > HDD
- 异步 > 同步
- 分布式 > 单机
架构设计-红包系统高性能解决之道
架构设计-重点总结
- 红包系统的特点:事务安全和高并发
- 高并发高性能解决概述
- 数据就近访问
- 高性能存储
- 异步减少等待和缓冲
- 横向扩展:分布式集群
- 红包系统的一些高并发高性能解决思路
- 高效存取:分布式缓存和本地缓存
- 缓冲:消息队列异步化
- 数据层横向扩展能力:分片
架构设计-超卖方案1-事务锁方案
- 行锁是一种悲观锁
- 适合写多和写冲突较多的场景
- 行锁
- 优点
- 稳定可靠,不会出现超卖
- 缺点
- 需要查询和计算:性能差、锁阻塞等待
- 锁阻塞等待会导致客户端延迟或超时
- 重试增加系统和网络开销
- 优点
- 在数据库事务中锁定操作行的语句
select * from t where id = ? from update;
- 在数据库事务中通过程序来计算和判断
- remain = 扣减后的数量
update t set remain = ? where id = ?;
架构设计-超卖方案2-无符号类型字段直接更新方案
- 将剩余数量和金额字段类型设置为无符号整数
- 字段不能为负数
- 如果被减为小于0,SQL执行会报错
架构设计-超卖方案3-乐观锁方案概述
- 假设数据不会被别人修改,只有自己,操作时验证一下
- CAS:先比较,再更新
- 适合写少和写冲突少的场景
架构设计-超卖方案3-乐观锁case语句方案
架构设计-超卖方案3-乐观锁where条件方案
架构设计-超卖方案-性能比较和建议
技术选型-验证框架
http://github.com/go-playground/validator
- 自称100分的验证框架
- struct 和 field 验证
- 包括交叉field、struct、Map、Slice and Array
- 支持自定义
技术选型-配置框架
http://github.com/tietang/props
- Key/Value 抽象,Unmarshal支持
- 多种配置源:本地文件和分布式配置源
- 组合配置源和上下文变量
技术选型-日志框架
http://github.com/sirupsen/logrus
- 结构化可插拔的标准日志工具
- 多种日志输出格式和自定义输出格式
- 支持自定义扩展 hook:定制,输出
技术选型-数据库工具
http://xorm.io
- 性能出色
- 功能足够
- 事务支持
技术选型-web服务框架
http://github.com/kataras/iris
- 性能出色
- 简单易用,强大的路由支持
- 自定义中间件扩展和丰富的中间件生态
技术选型-测试用例框架
http://github.com/smartystreets/goconvey
- go test集成,测试覆盖
- 自动化的 web UI
- 丰富的测试工具套件