记录线上环境碰到的问题:
-
新版本上线如何切换版本?
-
蓝绿发布?
-
Spring Task定时任务弊端有哪些?怎么解决?
弊端:
- 会有时间差,导致程序不严谨。
10.01下单,11点定时检查超过一小时未付款的订单,此时还差一分钟,需要等到12点定时查询才能删除。 - 不支持集群
假设使用10台机器,每次就会运行十次。
解决方案:使用Quarz - 会对数据库全表搜索,影响数据库性能。
select * from order where status = 1; 查询状态为1(未支付)的订单。因为状态未设置索引,则全表扫描。
定时任务只适用于小型轻量级项目,传统项目。
如何解决?
- 使用MQ消息队列,建立延时任务(队列)
10.12下单,11.12检查,状态如果还是未支付则删除。
- 会有时间差,导致程序不严谨。
-
对于超卖问题如何解决?
并发较小的项目(用户量小,传统项目):
- 在方法上加上synchronized (性能低下)
- 乐观锁 (性能低下,数据库连接有限,数据库层面也有锁)
// sql
update order set count = count - #{ buyCount } where id = #{ id } and count > #{ buyCount }
//java
int result = decr(id,buyCount);
if( result != 1){
throw new RunTimeException("库存不够!");
}
-
并发量较大:
分布式锁-> zookeeper,redis
-
Mybatis 分页插件嵌套查询BUG怎么解决?
Mybatis官方阐述。
解决方案:- 前端懒加载(前端先查询主表,再根据主表ID查询附表)
- 后端懒加载(后端先查询主表,再根据主表ID查询附表)
- mybatis select属性(select为查询id对应 ,column 传参,从上级select参数中获取 )
-
谈一谈分布式会话session
-
spring aop 嵌套切入的问题怎么解决?
原因:
public String say(String a) {
say2(a); // this.say2() ,并不会使用切面中的代码
}
public String say2(String a) {
return a + a;
}
- 解决方案一:
// 注入自己
@Autowired
private A a;
public String say(String a) {
a.say2(a);
}
public String say2(String a) {
return a + a;
}
- 解决方式二:
//使用AopContext.currentProxy())
public String say(String a) {
((OneBean)AopContext.currentProxy()).say2(a) ;
}
public String say2(String a) {
return a + a;
}
-
信息脱敏,跨域,防盗链
- 信息脱敏:根据相应算法对信息替换成*
- 跨域:后端配置
- 防盗链:防止其他网站盗用图片、视频等资源,可配置nginx (server块)
-
分布式session?
-
负载均衡hash算法宕机会出现什么问题?新增机器会出现什么问题? 一致性hash算法又是如何解决?
暂未完成,继续寻找问题。