注:更新至2018年4月21日,已经将源码放到github中,https://github.com/ibyeyoga/GrabTicket
场景
在高并发应用中,一个非常常见的案例就是——“秒杀”或者“抢票”,它们虽然名字不同,但是本质是一样的。可以用相同的解决方法去解决它们。
思路
一般思路是通过将用户的请求放到预先设定好的定长的队列中去,然后等系统一个一个地去处理,当然一开始这个队列的最大值就已经设置好了,所以只要不能进入队列的用户,都可以返回抢票失败。我在公司的时候也是通过这种思路去解决。这样做有好也有不好,是否采用这种做法根据需求而定。
我这里还有一种方法,就是当发放票券的人是生产者,抢票的用户是消费者,那么我一开始就往队列中塞进一定数量的票,而活动开始的时候,用户就开始消费,如果消费成功就将票券入库,如果失败就重新放回队列中去。两种做法各有千秋,还是那句老话,根据需求而定。下面代码主要介绍我这种做法。
关键代码如下:
|
|
|
|
|
|
生成票券:TicketProducer::provide(10);
抢票: