一、并发量大:
1)请求分发,分发到不同服务器,采用集群,Nginx或Apache来分发。
2)一般都会用缓存(本地缓存或第三方缓存),商品信息、剩余量放缓存,但具体的扣除操作,要加锁验证数据库库存,锁定的商品被放弃,放回可抢购状态更新缓存。
3)除了放缓存,也可加上标志位(比如volatile boolean hadEnd = false),防止活动结束了,还是频繁的调用接口验证。所以一般为了防止拖垮其他服务,将秒杀系统单独起一个服务。
4)页面静态化
5)缓存到CDN
二、防盗刷:限ip,限点击量、限请求数、限指定用户等各种限制。
三、找出速度快的若干用户:可以放到ArrayBlockingQueue(阻塞队列)指定长度队列,但最好用ConcurrentLinkedQueue并发队列(入队CAS比较,可能会失败,但相当快快快...),然后从队列取出用户一个一个进行商品购买。或者两者结合,先用ConcurrentLinkedQueue接收请求,再从中拿出请求放到ArrayBlockingQueue,然后单线程供“库存数据库服务”扣除库存操作。另外,最好用乐观锁(即版本号更新方式),失败也立即返回,防止阻塞太多死链接。
待续。。。
可学习的文章: