你好,感谢邀请,回答如下:
1.问题引入
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西。然而,从技术的角度来说,这对于Web系统是一个巨大的考验。当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要。
2.大规模并发带来的挑战
高并发秒杀功能,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态。现在我们来讨论下,优化的思路和方法。
第一: 请求接口的合理设计
第二:高并发的挑战:一定要“快”
第三:重启与过载保护
第四:时间控制方案
1.从线程方面解决
最简单粗暴的一种实现方案:Thread.sleep(800),但事实上这种方案一定会被很快pass,因为这种方式存在一个隐患,如果在多线程环境下,线程很容易被interrupt,这样代码就会抛出异常,这样线程就会挂起,导致整个线程异常结束。实在是不够优雅,违背了我们设计的初衷。
2.使用Timer
在jdk中提供了定时器类,类的主要作用就是控制一定的时间来简单的定时执行某个任务。有点简单的elasticJob的设计味道。下面一个最简单的例子来看一下如何实现定时任务:
public class TimmerTest {
/**
* 测试方法
*/
public void test() {
Timer timer = new Timer();
timer.schedule(new MyTask(), 800);
}
public class MyTask extends TimerTask {
/**
* 运行方法
*/
@Override
public void run() {
System.out.println("输出");
}
}
}
从方法来看,类继承自MyTask就可以实现定时执行,这种方法是可以实现延时的效果,但是它有一个致命的缺点:对代码的侵入性太大,为了实现定时我们不得已将对应的方法封装成一个类,然后放在定时器里执行。但未免也有点太得不偿失了,所以这种方式也被pass掉!
但是这里延伸一下,java可结合queartz实现的定时任务。
Quartz是一个任务调度框架。
一个例子:
package com.test.quartz; import static org.quartz.DateBuilder.newDate; import static org.quartz.JobBuilder.newJob; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.TriggerBuilder.newTrigger; import java.util.GregorianCalendar; import org.quartz.JobDetail; import org.quartz.Sche