实践课--手把手教你做系统设计| 青训营笔记

167 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天

准备工作

MySQL

  • 安装MySQL,推荐使用MySQL8及以上版本
  • 熟悉ddl,dml等基础语法
  • 了解sql优化

Redis

  • 安装Redis,推荐最新版本
  • 了解Redis的基本数据类型和使用场景
  • 熟悉常用命令
  • 了解Lua脚本的使用
  • 了解Redis分布式锁

RocketMQ

  • 安装RocketMQ,推荐最新版本
  • 了解RocketMQ的基础概念和架构
  • 了解MQ的使用场景
  • 了解生产者如何保证消息的可靠性发送
  • 了解消费者如何保证幂等
  • 了解消费者pull和push模式的区别

OpenResty

  • 安装OpenResty,推荐最新版本
  • 了解Nginx的基础概念和使用
  • 了解Lua脚本的语法

Linux

  • 熟悉常用命令
  • 熟悉进程和线程
  • 了解Linux调优

Java

  • 按照JDK,推荐JDK11
  • 熟悉Java基础语法和lambda表达式
  • 熟悉idea的使用
  • 了解并发编程
  • 了解springboot框架的使用
  • 了解maven的使用

Jmeter

  • 安装Jmeter
  • 了解使用Jmeter压测

作者:青训营官方账号
链接:juejin.cn/post/719438…
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

项目概述

设计一个电商秒杀业务

系统设计流程

4S 分析法:

  1. 场景分析(什么系统,需要什么功能,并发量多少)
  2. 存储设计
  3. 服务设计(业务功能和逻辑)
  4. 可扩展性

发现系统瓶颈

  1. 火焰图
  2. 链路追踪
  3. 性能测试

电商秒杀业务介绍

消费侧 供应侧 交易环境

SPU SKU

业务特点

  1. 瞬时流量高
  2. 读多写少
  3. 实时性高

挑战

  1. 反欺诈
  2. 防止超卖
  3. 流量管控
  4. 高性能
  5. 扩展性
  6. 鲁棒性
  7. 资源成本

如何设计秒杀系统

上面说到的 4S 分析法

存储方面 :

Localcache-->redis-->mysql

服务方面 :

ID 生成器:分布式 id MQ 组件:为了削峰 ...

扩展方面:

  • 流量隔离
  • CDN
  • 缓存优化
  • 流量管控

代码

关键部分

db 锁性能差,是行锁 如果先 get 再 decrease,不是原子性的,也可能有问题。 故而使用 redis 脚本保证原子性

锁方面,加锁通过代码,解锁通过 redis 脚本(防止误删),lock 有一个唯一的 uuid

nginx 动静分离 ip rate limit 为了防刷单等黑产

jmeter 压测工具

思考

  1. 当用户请求放到 MQ 中,其实已经返回了 true, 如果这个时候用户去取消订单/查看订单(但 MQ 还没处理这个订单时),该怎么处理这个情况。

总结

  1. 服务无状态(当前服务不存储状态,不存储数据)
  2. 批量写入(降低系统压力很好的手段)
  3. 最终一致性(redis ,MQ 等可能导致数据不一致)