定时器
1、Linux,Crontab,周期运行Shell脚本,可以用于清理日志
详见:https://www.jianshu.com/p/988a2dd7c242
2、Java Timer,周期运行Java程序
详见:https://www.jianshu.com/p/f82f3b9a3f9e
3、Spring Scheduling,周期运行Java程序
详见:https://www.jianshu.com/p/4ae315debf03
Spring部署了多台,需要分布式锁,保证只有一台执行了定时任务
4、RocketMQ,setDelayTimeLevel(),单次定时消费
详见:https://www.jianshu.com/p/b18107ac8abf
5、MySQL,create event on schedule,周期运行存储过程,可以用于清理数据
详见:https://www.jianshu.com/p/058daf3f44d7
单点登录
SSO:Single Sign On,单点登录
角色:认证中心、子系统
认证中心:只有一个认证中心,只在认证中心提供登录界面
全局会话:认证中心持有的用户会话信息
局部会话:单个子系统持有的用户会话信息
认证流程
1、用户访问子系统,子系统发现没有该用户的局部会话,跳转到认证中心
2、认证中心发现没有该用户的全局会话,跳转到登录界面
3、用户登录后,认证中心创建该用户的全局会话 和 授权令牌,带着授权令牌跳转回子系统
4、子系统拿令牌让认证中心校验令牌有效性,并创建局部会话
注销流程
1、用户在子系统注销,子系统拿令牌让认证中心注销全局会话
2、认证中心向所有子系统发出注销请求,各子系统销毁局部会话,重回认证流程
方案
1、Apereo CAS
CAS:Central Authentication Service
官网:https://apereo.github.io/cas/5.3.x/index.html
源码:https://github.com/apereo/cas
Jasig组织:Java in Administration Special Interest Group,是1999年成立于美国的开源组织
Apereo基金会:2012年,Jasig组织与Sakai基金会合并为Apereo基金会
历史:CAS最早由Yale大学创立,2004年成为Jasig的项目,现由Apereo维护
2、Spring Security OAuth 与 Spring Social
见:https://www.jianshu.com/p/98af876d2e2c
秒杀
问题:用户会不停刷新秒杀页面
方案:前端性能优化 + CDN
问题:客户端时间与服务器时间不同步
方案:刷新页面时,从服务端获取时间,对比与本地时间的差距,之后每分钟与服务器同步一次时间
# Nginx直接返回时间
location ~ ^/get_time {
default_type application/json;
return 200 '{"status":"success","time":"$time_local"}';
}
问题:用户会重复点击抢购按钮
方案:点击一次以后灰化按钮,刷新页面再点击,提示已抢购 或 自己的抢购结果 或 秒杀进度
问题:内行人员会绕过浏览器,重复抢单
方案:对同一个会话进行限流,一个会话只能提交一次
问题:海量订单写请求
方案:将订单请求push到消息队列,队列长度上限即库存量,push不进队列的请求,直接返回抢购失败
问题:海量库存读请求
方案:将库存提前写入缓存,接受来自客户端 和 消息消费者 的库存查询
分布式锁
功能:保证同一个方法在同一时间只能被一台机器上的一个线程执行
概念
加锁:语义上可以和 “获得锁”、“得到锁”通用
拥有锁:加锁后即拥有了锁
可重入锁:锁的拥有者 可以重复加锁
悲观锁:即悲观得认为别人随时会来更新数据,所以一开始就加锁。一锁二查三更新。数据库自带机制,select * from person for update of person.name; 锁定person.name,事务提交或回滚后才释放
乐观锁:即乐观得认为别人不会来更新数据,所以一开始不用加锁。表中引入一个版本号(version)字段,查数据时得到version,更新数据时检查数据库中version是否变化,如果是,则正常更新,同时version加1。如果不是,则更新失败。
一、基于数据库实现分布式锁
原理:
1、数据库里设置一张表,有唯一性约束的method_name字段
2、加锁时,插入一条记录
3、释放锁时,删除这条记录
缺点:
1、锁没有失效时间,一旦解锁操作失败,后续再也没有线程能加锁
2、没有加锁排队机制
3、不能重入
4、性能稍差
二、基于缓存实现分布式锁
原理:与一类似
缺点:
1、没有加锁排队机制
2、不能重入
三、基于Zookeeper实现分布式锁
原理:
1、客户端在ZK中创建一个临时锁,一旦Session连接断开,这个临时锁就会自动删除
2、有加锁排队机制,客户端可以监听队列变化
3、客户端可以查询自己是否拥有锁
OpenAPI
术语约定:secret,key 约定为 key
方案1:每次请求带上key
案例:旷世Face++平台
方案2:用key调用登录接口得到token,后续每次请求都带上token
缺点:token有有效期,客户端需要管理token
案例:百度大脑平台
方案3:让请求参数 和 key参与签名得到sign,请求时带上sign
优点:不用在请求中带key
案例:腾讯AI开放平台
随机数
1、commons-lang3
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
RandomStringUtils.randomAlphanumeric(16);
2、commons-codec
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.12</version>
</dependency>
new SecureRandom().generateSeed(8);
JSON
1、Jackson
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
new ObjectMapper().writeValueAsString(object or map)
2、FastJson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
JSONObject.toJSONString(object or map)
网友评论