java实现多线程抢单_Java Web高并发抢单如何实现?

这种问题差不多已经烂大街了,各家电商实践这么多年,公开的资料都有很成熟的实践思路甚至源码,看现有回答都还有各种各样的问题,感觉各位真的很不走心的回答问题呢。

秒杀这个功能,往简单的说就是一个资源争夺的典型例子。一些书里经常会用多终端共享打印机来说明这种独占资源共享的场景。解决资源抢占冲突的手段往往就两个,减少冲突方或增加资源。

秒杀需要占用的最重要资源是库存计数,其次是执行时间。抓住这个关键点就好办了,用什么框架什么技术,无非也就是保证这个计数不被脏读脏写,同时保障其他流程快速稳定地运行至结束。

那么最简单的思路,就是将请求排队,再慢慢消化这些。也就是说,虽然很多订单请求过来,但是真正处理订单的处理程序就一个,所有请求被队列hold住后由单一程序处理,这样直接避免了脏读脏写问题。这种方案用得最多的就是下边很多答主提到的消息中间件。

但这样的方案是以降低吞吐量为代价的,毕竟仅安排一道程序处理队列,队列平均等待时间会非常长。

这种设计通常用户会感觉秒杀后系统相当长时间失去相应。

进阶的做法就是想办法快速消耗队列,比如不再使用单线程处理队列,转为仅使用队列进行任务调度,并由调度程序控制库存计数,订单后续操作分派到其他线程甚至其他服务完成。这样,库存计数仍然由单线程顺序操作,可以避免脏读脏写问题,同时调度线程可以迅速消耗队列,队列平均等待时间可以进一步缩短。

这样的秒杀模型就变成了一个,预先占有资源后并发处理后续流程的模型。如果抢占不到资源,调度器自然会将请求交由错误处理程序处理。

队列平均等待时间减少带来最直观的感受,就是用户觉得秒杀结果出来更快。

以上两种方案,是以保护共享资源为出发点做文章,为了保护共享资源,不可避免的选择降低资源访问频率来降低冲突可能性,从而影响程序速度和用户体验。

另一种思路是增加资源,从而进一步降低资源争夺的可能。

其中一种较为广泛的技术是多级缓存机制,其根本原理是将单一的库存计数以更细粒度拆分。这样可抢夺资源变多,资源争夺的概率就会降低。同时,这种设计还可以进一步横向扩展,充分利用集群优势。

更复杂的还有以单元架构为基础,结合以上多种手段,从每年天猫双十一后公开的文档看,几乎能扛住所有秒杀流量了。

想清楚了这些手段,用的什么框架,什么存储方案,几乎都能建立起一套轻松抗百万并发的系统,并不是其他回答所说的,框架不优秀导致,更不是简单一句优化就可以做到的。

建议题主仔细分析自己的业务需要多高的复杂度,需要多复杂的实现,秉承够用就好的选择,选择最佳方案。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值