这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
主要内容
分别学习了系统设计方法论的相关知识、秒杀系统的理论,最后通过一个java实践项目加深理解。
具体内容
系统设计方法论
为什么要做系统设计:对个人可以提高个人的能力,面试时也会遇到系统设计的题,同时能够扩宽个人的视野,对企业来说业务驱动、系统重构、
评估系统:
有很多评估维度,可以从可用性、易用性、扩展性等方面进行评估,重点是理解,而不是死记。
系统设计的定义:为了达成某种目的,通过个体组成整体的过程。
系统设计的流程:实际有很多的流程,课程中只是介绍了一种。
场景->存储->服务->扩展
场景设计包括分析有多大的并发量,存储设计包括数据如何组织等内容,是用sql存储还是nosql存储;服务设计即业务功能实现与逻辑整合;可扩展性就是提高鲁棒性、可扩展性。
因为这四个步骤的英文单位开头都是s,因此也被称为4s原则。
发现系统的瓶颈
- 火焰图分析:找到代码的瓶颈
- 链路追踪:找出一次请求在哪个服务上耗时较大。
- 性能测试:挖掘整个系统的不足
系统的可用性和稳定性
要做链路梳理、可观测性、全链路测试、稳定性控制、容灾演练。
全链路测试:包括压力测试、负载测试、容量测试。压力测试是指,找出链路的负载。 容灾演练: 稳定性控制:保证系统的稳定性。包括系统限流、业务兜底、熔断降级。都是老生常谈的了。 容灾演练:混沌工程(可以理解成故障注入,)、应急手册、容灾预案。
里面很多东西见的不多,但是不需要抠字眼。
电商秒杀系统的理论
电商相关概念
需要三个角色:人、货、场。
商品的定义:具有交易价值和属性的信息载体。(额,感觉好抽象)
SPU:Standard Product Unit(标准的产品单元)
SKU:Stock Keeping Unit(库存保持单元,会有库存、价格等信息)
为什么要标准化:现在的商品太多了,为了方便管理。
秒杀业务的特点:
- 读多写少
- 瞬时流量高
- 实时性要求高 秒杀业务的挑战:
- 资源成本(因为资源是有限的)
- 反欺诈(主要是因为秒杀的特点,即秒杀商品价格较低,抢到后可以二次出售后牟利)
- 高性能
- 防止超卖(如果超卖是一个非常严重的事故)
- 流量管控(瞬时流量很大,因此要对流量进行管控)
- 扩展性
- 鲁棒性(稳定性和可用性,系统肯定要达到这个要求)
如何设计秒杀系统
1.场景
首先要分析秒杀系统的功能,其次要考虑并发量的问题。 秒杀系统的功能包括:活动发布、秒杀的商品的详情(一个读的接口)、秒杀下单相关(一个写的接口)的功能。 并发量要考虑的内容(对本节课):万人参与秒杀、QPS 1w+、TPS 1k+
2.存储
是十分重要的环节,决定了底层数据的组织方式。本节课讲解的内容用了三级存储,包括mysql、redis、和localcache。之后详细介绍了各个表的功能,主要是对数据库的设计有一个整体的了解。以后如果有需要,可以在讲解的表的基础上进行扩展。
3.服务
子服务:包括用户、风控、活动、订单。
基础组件:ID生成器、缓存组件、MQ组件(削峰)、限流组件(保护系统稳定性)。
4.扩展
讲解了很多概念,包括流量隔离、CDN、缓存优化、流量管控,此外还有数据库的扩展、redis的扩展、MQ的扩展、服务水平和垂直扩展。
流量隔离是为了防止影响常规业务。CDN是为了提高静态资源的访问速度,CDN是离自己较近的一些节点。数据库扩展包括读写分离、分库分表等操作,服务水平扩展涉及到负载均衡、反向代理,MQ的扩展是为了保证MQ的可用性,redis的扩展也是为了保证redis的可用性,服务垂直扩展可以理解成对微服务进行拆分。
5.系统架构图
分为了用户层、接入层、应用层、基础层。
接入层本节课用了nigix,没有用到其他的组件。应用层感觉可以理解成具体要写代码、要实现业务的部分。基础层主要是用大的一些基础中间件,比如redis、mysql、RQ等。
秒杀系统实践
重点讲解了其中的部分代码以及逻辑。 秒杀流程图可以帮助我更好的理解整个秒杀的流程,因此需要检验用户、超时检查等功能。
总结
经过这节课程的学习,主要是了解了秒杀系统的相关基础概念,并且通过老师的讲解,加深了对代码的理解。