分布式ID
相关概念
传统方案在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品。对数据分库分表后需要有一个唯一ID来标识一条数据或消息
分布式ID特点:
- 全局唯一
- 高并发、高可用
实现方案
需求
- 运行在 docker 容器里生成的 ID 唯一
- 一个应用在一台服务器,ID唯一
- 相同应用在多台服务器,ID唯一
- 多个应用在一台服务器生成的ID唯一?不需要
方案:
- 时间戳:不满足全局唯一
- UUID:不能生成递增有序的数字,索引效率下降
- 数据库主键自增:并发性能不高,受限于数据库性能;分库分表需要改造,较复杂;自增-数据量泄露
- Redis自增:数据丢失;自增-数据量泄露
- 雪花算法:时钟回拨
开源组件
- 百度:uid-generator,Java实现, 只支持Snowflake算法,最终单机QPS可达600w,维护少
- 滴滴:Tinyid,Java实现, 只支持数据库号段算法,最终单机QPS可达1000w
- 美团:Leaf,Java实现, 支持数据库号段算法和Snowflake算法,最终单机QPS可达5w/s,高可用
使用美团的Leaf组件:项目集成Leaf
分布式Session
相关概念
场景:用户模块—登录登出
Session存储位置:Tomcat
Cookie跨域问题:浏览器会根据 Cookie 的 domain 属性进行判断访问哪个域(127.0.0.1,localhost)会携带这个Cookie
实现方案
- Token + Redis
- JWT:Json Web Token
- OAuth2:授权机制(授权数据给第三方:QQ、微信、微博授权登录)
开源组件
- Java-JWT:java-jwt
- spring-security-oauth2:spring-security-oauth2
解析JWT-jwt.io/:token里的内容可以被解析,但是不能被篡改
分布式任务调度
相关概念
任务调度场景:
- 报表:电商
- 日/月结单:支付
- 爬虫
- 数据归档
开源组件
分布式任务调度框架
- Quartz:Quartz-W3Cschool
- Elasticjob
- XXL-JOB:XXL-JOB的使用
- SchedulerX:非开源
- PowerJob
分布式限流
相关概念
限流场景:秒杀
限流原理:
- 漏桶算法
- 令牌桶算法
开源组件
- 单机版限流(非分布式)Guava RateLimiter:Guava RateLimiter
- Sentinel:Sentinel
压测工具:JMeter、AB(Apache Bench)
分库分表
相关概念
分库分表原因:数据库性能瓶颈
拆分方式
- 水平拆分:每个表结构都一样
- 垂直拆分:表的多个字段拆分到多个表中
实现方案
- ShardingSphere:shardingsphere
- Mycat:mycat
分布式事务
相关概念
场景:订单系统要创建订单,向商品系统发出扣库存的请求,商品系统扣库存成功并返回订单系统扣库存的通知,订单系统接收到通知后会创建订单。但是商品系统扣完库存,也成功返回了订单系统通知,但是由于某种原因,订单系统并没有成功创建订单,那么商品系统的扣库存操作就需要回滚
实现方案
分布式锁
相关概念
作用:为了防止分布式系统中的多个进程或线程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁
实现方案
- Redis:setnx命令,原子性操作
- Zookeeper:顺序临时节点
开源框架
- redisson:redisson