这是我参与「第五届青训营」伴学笔记创作活动的第 16 天
前情回顾
存储系统
- 块存储
- 文件存储
- 对象存储
- key-value存储
数据库系统
- 关系型数据库、非关系型数据库(MongoDB)
分布式架构
- 数据分布策略、数据复制协议、分布式事务算法
经典案例
春节抖音红包雨
在领红包的过程中涉及到以下操作:
- 从抖音账户上扣除金额
- 用户账户上添加金额
update account_table set balance = balance - '小目标' where name = '抖音'
update account_table set balance = balance + '小目标' where name = '用户'
案例中可以了解到,生活中的一些场景是会用到RDBMS的
RDBMS事务ACID
事务(Transaction) :是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性
BEGIN
update account_table set balance = balance - '小目标' where name = '抖音'
update account_table set balance = balance + '小目标' where name = '用户'
COMMIT;
ACID
- 原子性(Atomicity):事务是一个不可再分割的工作单元 ,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
- 持久性(Durability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚或丢失。
原子性A
事务中的操作要么同时发生,要么同时不发生
例如在红包雨活动中,如果只在抖音账户中扣除了金额,而用户的账户中没有添加金额,那么对抖音来说是血亏的,而用户也是不赚的,对双方都没有好处
一致性C
如果没有一致性
那么假设抖音账户还剩下0.5个亿,结果扣除了1个亿,还剩下-0.5个亿,那么必将导致严重后果
一致性是指每个操作都必须是合法的,账户信息必须从一个有效的状态变为另一个有效的状态
ACID中一致性的概念更多指的是业务逻辑的合法性
隔离性I
当用户在抖音领导红包后,同时在头条领到了红包
当抖音和头条的账户同时扣除1个亿的金额后
抖音和头条最初检测到用户账户都是0,同时更新余额为1个亿,最后账户余额就是1个亿
抢了两个红包结果显示一个红包的金额,这显然是不对的
这就是隔离性的问题,两个事务之间是由互相影响的因素在的
这里的隔离性是指:两个账户在对同一个账户并发进行操作时,应该是互不影响的,表现得像是串行操作
持久性
当用户领到红包后,服务器宕机了,导致金额又回到了应该扣除的账户中
这就是持久性的概念
持久性是指操作更新成功之后,更新的结果应该永久性的保留下来,不会因为宕机等问题而丢失。
高并发Concurrency
Case 5 :全国14亿人,假设有10亿人同时开抢红包,若每秒处理一个请求,那需要31年才能完成。春节完了,抖音可能也被大家嫌弃了…
但是若
但是若每秒能处理1000W请求,那么只需要1min40s即可处理完所有的请求
高可靠High Reliability/Availability
Case 6 :假设除夕晚上大家正在愉快的从抖音身上“薅羊毛”,这时候服务器挂了,程序员花了一个小时,头发都掉光了,终于修好了。这时候发现李谷一老师《难忘今宵》都唱完了。"抖音宕机”秒上热搜
这就说明,一些关键实践节点要提供的服务必须是稳定可靠的,否则会给用户造成不好的体验和印象