本站提供互联网编程技术交流分享,部分技术教程不断更新中,请随时关注或联系我寻求帮助 有事点我吧同时也欢迎有兴趣的朋友进行投稿。

如何设计一个秒杀系统

java 熊哥club 269℃ 0评论

这篇文章已经很久了,当初的设想是单机编程,每台服务器获得自己能够卖出多少产品,用户被随机分配到每台机器上进行处理。

一、题目

1, 这是一个秒杀系统,即大量用户抢有限的商品,先到先得

2, 用户并发访问流量非常大, 需要分布式的机器集群处理请求

3, 系统实现使用Java

二、模块设计

1, 用户请求分发模块:使用Nginx或Apache将用户的请求分发到不同的机器上。

2, 用户请求预处理模块:判断商品是不是还有剩余来决定是不是要处理该请求。

3, 用户请求处理模块:把通过预处理的请求封装成事务提交给数据库,并返回是否成功。

4, 数据库接口模块:该模块是数据库的唯一接口,负责与数据库交互,提供RPC接口供查询是否秒杀结束、剩余数量等信息。

第一部分就不多说了,配置HTTP服务器即可,这里主要谈谈后面的模块。

用户请求预处理模块

经过HTTP服务器的分发后,单个服务器的负载相对低了一些,但总量依然可能很大,如果后台商品已经被秒杀完毕,那么直接给后来的请求返回秒杀失败即可,不必再进一步发送事务了,示例代码可以如下所示:

并发队列的选择

Java的并发包提供了三个常用的并发队列实现,分别是:

  • ConcurrentLinkedQueue
  • LinkedBlockingQueue
  • ArrayBlockingQueue

ArrayBlockingQueue是初始容量固定的阻塞队列,我们可以用来作为数据库模块成功竞拍的队列,比如有10个商品,那么我们就设定一个10大小的数组队列。

ConcurrentLinkedQueue使用的是CAS原语无锁队列实现,是一个异步队列,入队的速度很快,出队进行了加锁,性能稍慢。

LinkedBlockingQueue也是阻塞的队列,入队和出队都用了加锁,当队空的时候线程会暂时阻塞。

由于我们的系统入队需求要远大于出队需求,一般不会出现队空的情况,所以我们可以选择ConcurrentLinkedQueue来作为我们的请求队列实现:

 

本文地址: http://www.xiongge.club/1153.html

转载请注明:熊哥club » 如何设计一个秒杀系统

喜欢 (0)
[您的支持是我最大的动力]
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮