这是我参与「第五届青训营」伴学笔记创作活动的第 11 天
零、前言
本文记录和整理了本人在跟随字节青训营学习的一些我个人感觉比较重要的内容和知识,也有一部分内容是我认为自己比较难理解或记忆的,也一并记录于此文。
撰写本文的目的主要是方便我自己的复习和查阅,倘若各位读者有与我相似的问题,也可以参考之,如果对各位有帮助那就是我莫大的荣幸,也期望各位不吝赐教,多多指出我的问题,可以在下方留言或者私信我。
一、课程大纲与概述
本节课程主要分为四个方面:
- 系统设计方法论
- 电商秒杀业务介绍
- 课程实践
- 课程总结
课前部分主要罗列课程中涉及到的中间件和相关背景知识。
对于使用到的中间件,需要体验了解概念,安装并正确使用。课中部分会详细讲解系统设计的方法论和秒杀系统实践,帮助同学们入门系统设计。课后部分会做一些总结,梳理核心思想和重点。
二、详细知识点介绍
0. 课前概念明确
了解基本的电商概念和流程
-
电商平台业务:电商平台业务是一种在线市场平台,它允许商家在线销售商品和服务,消费者可以在线购买。它们通常提供购物车功能,以及支付和配送管理。常见的电商平台包括亚马逊,天猫,京东等。
-
秒杀业务特点:
- 限时特价:通常在一定时间内提供限量的商品,以促销的方式吸引顾客购买。
- 快速抢购:顾客必须在规定的时间内购买,否则将无法获得特价商品。
- 高效稳定:电商秒杀业务需要具有高效稳定的技术支持,以应对大量用户的同时访问。
- 实时信息:提供实时的商品信息,如剩余数量和销售情况,以帮助顾客决策。
- 抢购热情:秒杀活动通常能引发顾客的抢购热情,从而提高销售额。
MySQL
-
安装MySQL,推荐使用MySQL8及以上版本
笔者有一篇安装笔记:学习记录丨MySQL入门 | 落雨乄天珀夜 (gitee.io)
-
熟悉ddl,dml等基础语法
DDL (Data Definition Language) 是MySQL中用于定义数据结构的语句,例如:
- CREATE: 创建数据库或表
- ALTER: 修改数据库或表的结构
- DROP: 删除数据库或表
- TRUNCATE: 清空表数据
DML (Data Manipulation Language) 是MySQL中用于操作数据的语句,例如:
- SELECT: 查询数据
- INSERT: 插入数据
- UPDATE: 更新数据
- DELETE: 删除数据
-
了解sql优化
阅读打卡活动中有一篇文章与之有关:SQL优化思路+经典案例分析 - 掘金 (juejin.cn)
Redis
-
安装Redis,推荐最新版本
-
了解Redis的基本数据类型和使用场景
-
熟悉常用命令
-
了解Lua脚本的使用
-
了解Redis分布式锁
笔者有一篇Redis入门的笔记,可以参考:
所用皆鹰腾 破敌过箭疾-Redis丨学习记录 - 掘金 (juejin.cn)
也可以去我的个人博客中查看,内容一致;
关于Redis分布式锁:
Redis分布式锁是一种利用Redis实现的分布式系统中的锁机制,用于解决在分布式环境下的并发问题。
通过在Redis服务器上设置一个独占锁,来防止多个进程或线程同时执行相同的操作。
当一个进程获取了锁之后,其他进程将无法再次获取锁,直到该进程释放锁。
RocketMQ
-
笔者附加:RocketMQ和RabbitMQ的区别?
- 架构:RocketMQ采用分布式架构,而RabbitMQ是一个中心化的消息队列系统。
- 集群支持:RocketMQ支持高可用性和可伸缩性,支持海量消息处理,而RabbitMQ也支持集群,但不如RocketMQ强大。
- 消息存储:RocketMQ支持存储消息,以便确保消息不丢失,而RabbitMQ默认不存储消息,需要开启持久化选项。
- 消息分发:RocketMQ支持消息的广播和点对点模式,支持负载均衡和顺序消息,而RabbitMQ也支持多种消息分发模式。
- 消息投递:RocketMQ支持消息的可靠性投递,而RabbitMQ支持消息的可靠性和异步投递。
- 安装RocketMQ,推荐最新版本
- 了解RocketMQ的基础概念和架构
- 了解MQ的使用场景
- 了解生产者如何保证消息的可靠性发送
- 了解消费者如何保证幂等
- 了解消费者pull和push模式的区别
OpenResty
-
安装OpenResty,推荐最新版本
OpenResty是一个集成了NGINX web服务器、LuaJIT脚本语言和各种库和模块的web平台。它为构建web应用程序、反向代理、内容分发网络和其他基于web的系统提供了一个高性能和可扩展的平台。
OpenResty利用NGINX服务器的性能和Lua编程语言的灵活性来创建一个易于使用和高度可定制的平台。有了OpenResty,开发人员可以使用各种工具和库来创建自定义功能,快速而轻松地构建和部署web应用程序。
-
了解Nginx的基础概念和使用
Nginx是一个高性能的开源web服务器和反向代理。它是为处理高流量而设计的,并因其速度、稳定性和可扩展性而流行。Nginx可以用来提供静态内容,作为HTTP、HTTPS、SMTP、POP3和IMAP协议的反向代理,还可以作为跨多台服务器分配流量的负载均衡器。它被广泛用于支持web站点、应用程序和内容分发网络。Nginx可以轻松配置和扩展模块,使其成为各种基于web的用例的灵活工具。
-
了解Lua脚本的语法
Linux
-
熟悉常用命令
-
熟悉进程和线程
-
了解Linux调优
笔者有一篇Linux入门的笔记,可供参考:学习记录丨Linux + Shell | 落雨乄天珀夜 (gitee.io)
另外,关于进程和线程:
- 定义:进程是一个独立的程序在操作系统中的执行实体,拥有自己的内存空间、系统资源和独立的运行环境;线程是一个进程中的执行流,是进程的最小单位。
- 资源:进程拥有独立的内存空间和系统资源,但是线程共享进程的资源。
- 运行:一个进程可以包含多个线程,进程间独立运行,而线程间可以共享内存,共同完成一个进程的任务。
- 效率:线程比进程更加高效,因为线程共享进程的资源,创建线程的开销比进程要小。
Java
- 按照JDK,推荐JDK11
- 熟悉Java基础语法和lambda表达式
- 熟悉idea的使用
- 了解并发编程
- 了解springboot框架的使用
- 了解maven的使用
Jmeter
-
安装Jmeter
-
了解使用Jmeter压测
Apache JMeter是一个开源的性能测试工具,用于测试web应用程序、api和其他系统的性能。它允许开发人员和测试人员模拟系统上的重负载,例如大量并发用户,以测量其响应时间、吞吐量和其他指标。JMeter提供了一个图形用户界面,用于创建测试计划、定义测试用例和分析结果。它支持多种协议,包括HTTP、HTTPS、FTP、JDBC和JMS,并且可以通过使用插件进行扩展。由于其强大的功能和易用性,JMeter是一种流行的基于web的系统性能测试和优化工具。
以上技术栈笔者有待完善
1. 课中细节学习
为什么要做系统设计
系统设计是软件工程的一个重要环节,具有如下几个重要目的:
- 明确需求:通过对需求进行分析,确定系统的功能、性能和可靠性需求。
- 架构设计:通过分析系统的组成部分,设计出系统的架构,包括系统的整体结构、各个组件之间的关系以及通信协议等。
- 预估成本:通过对系统的设计,预估出开发、测试和维护的成本,以便对项目进行合理的计划和安排。
- 保证可扩展性:通过合理的设计,保证系统的可扩展性,以适应未来的业务发展需求。
- 降低风险:通过对系统的设计,降低开发过程中的风险,以保证项目的顺利完成。
系统设计的概念是什么
系统设计是指对系统的功能、性能、可靠性、安全性、易用性、可扩展性等特性进行详细设计,并确定各个部分间的接口、协议、通信方式、数据格式等。系统设计是软件工程的一个重要环节,旨在通过对需求进行分析,制定出可行的、经济的、可扩展的、可维护的系统解决方案,为后续的实现提供指导。
如何做系统设计
4S分析法:
- Scenario 场景:需要设计哪些功能,设计的质量性能等等需要有什么要求
- Service 服务:大系统拆分成小系统
- Storage 存储:数据如何存储,如何访问
- Scale 升级:优化维护,解决缺陷,处理可能遇到的问题
如何分析系统瓶颈和优化
- 火焰图分析
- 链路分析
- 全链路压测
如何验证系统的可用性和稳定性
- 链路梳理
- 可观测性
- 全链路测试
- 稳定性控制
- 容灾演练
2. 电商和秒杀
基本概念
-
Spu与Sku:
SPU(标准产品单位)和SKU(库存单位)是电子商务和零售管理中常用的术语。
- SPU:产品基本信息,如名称、品牌、型号、类别、通用规格等。它是一个产品标识符,在同一产品的所有变体中都是唯一的。
-
SKU:指产品的特定变体的唯一标识符,如尺寸、颜色和其他选项。它用于跟踪库存水平,并帮助零售商有效地管理库存。
简而言之,SPU指的是一般的产品,而SKU指的是该产品的特定版本。
- 秒杀业务的特点:如上文
秒杀的挑战
- 资源有限性:指系统内部的资源,如内存、带宽、硬盘空间等,是有限的。
- 反欺诈:指采取措施来防止欺诈行为的发生。
- 高性能:指系统的运行速度快、效率高。
- 防止超卖:指防止商品被卖完后,仍有客户购买到该商品。
- 流量管控:指对系统内部或外部的流量进行管理和控制,以保证系统正常运行。
- 扩展性:指系统具有较强的可扩展性,可以根据业务需求进行扩展。
- 鲁棒性:指系统具有较强的鲁棒性,即能够适应各种情况,不容易出错。
3. 设计秒杀系统与实践总结
系统架构图
秒杀流程图
THE END