查看: 5164|回复: 4
收起左侧

秒杀业务

[复制链接]

1

主题

9

帖子

39

积分

新手上路

Rank: 1

积分
39
发表于 2017-12-6 23:11:02 | 显示全部楼层 |阅读模式
飞哥,我最近这个问题困扰我很久了。我打算弄个秒杀业务模块,SSM结构的工程。我打算用activeMQ来实现高并发。我遇到一个问题,就是一个Controller发一个消息在队列中,我使用了事务。但是,我后台有大概2000个线程在处理。后台处理时,因为秒杀主要就看库存够不够的问题,所以,有很大一部分秒杀请求,是无法购买成功的,这个时候我希望跳个页面给客户,但是,Controller执行完发消息,就完了。怎么才能让客户知道,自己是否购买成功呢?如果用redis做库存的话,怎么能防止同一个客户的重复秒杀呢?我这里用的是数据库的联合主键,来防止重复秒杀的。飞哥,如果问题描述的不清楚,我希望可以单独聊聊。因为这个问题,困扰我很久,我对大数据处理和并发编程的能力很欠缺,求指导!!!飞哥。。。。
回复

使用道具 举报

566

主题

713

帖子

3823

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3823
发表于 2017-12-11 08:58:03 | 显示全部楼层
秒杀业务这块,你可以先把用户的秒杀请求写入队列,然后根据你的规则读取秒杀请求。

秒杀成功或者失败都可以跳转页面的,跳转一下就好,发完消息,不能跳到一个页面吗?让用户等待之类的也行,然后处理完成之后直接在页面显示就好了。

redis做库存的问题,你在前端用消息队列控制,让用户的请求不能重复就好。

抱歉,这几天比较忙,回复比较慢。你这个问题还没处理好,到时候,可以发下到我邮箱,我看看。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

39

积分

新手上路

Rank: 1

积分
39
 楼主| 发表于 2017-12-15 22:34:56 | 显示全部楼层
johnny 发表于 2017-12-11 08:58
秒杀业务这块,你可以先把用户的秒杀请求写入队列,然后根据你的规则读取秒杀请求。

秒杀成功或者失败都可 ...

这个问题我明白了!主要还有三个问题。
第一个问题:在不能分库分表的情况下,如果一个数据库的数据量有几百万条,查询效率很低,而且这个数据的数据每天都是增长的,且增长的非常快,这就不太适合做索引那该怎么办?
第二个问题:用mycat分库分表用主键求余的方式得到这条数据改进哪个库,如果某天我要扩容,那么求余的话的顺序就不对了。这样的话会不会影响查询?如果影响的话,我该怎么办?
第三个问题:mysql复合索引使用的注意事项有哪些?
飞哥,求助,这些问题我都不太懂
回复 支持 反对

使用道具 举报

566

主题

713

帖子

3823

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3823
发表于 2017-12-17 13:41:59 | 显示全部楼层
黑马CJ 发表于 2017-12-15 22:34
这个问题我明白了!主要还有三个问题。
第一个问题:在不能分库分表的情况下,如果一个数据库的数据量有几 ...

1、不太适合做索引,可以做读写分离的配置
2、mycat扩容的,可以看看这两篇文章:用的一致性hash算法搞的
                    http://blog.csdn.net/ydyang1126/ ... ionNum=11&fps=1
                    http://blog.csdn.net/wangshuang1631/article/details/69055958
3、使用复合索引注意事项:
             举个例子:触发复合索引【联合】条件(name,address)--必须有优先查询索引列
                    select * from person where name=’11’;  会触发索引
                    select * from person wherer name = '11' and address = '22'; 会触发
                    select * from person wherer name = '11' or address = '22'; 不会触发
                    select * from person wherer address = '22'; 不会触发


      
回复 支持 反对

使用道具 举报

566

主题

713

帖子

3823

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3823
发表于 2020-5-26 22:15:39 | 显示全部楼层
秒杀解决方案

秒杀
        高并发
        高可用

高并发:

- 分布式服务、负载均衡、集群
- 保证单个服务的QPS足够高
- 必须尽可能减少单个业务执行时间

订单业务:

- 业务复杂,执行链路较长
- 跨越服务较多
- 写和读操作频繁
执行效率低,并发差
解决思路:减少业务执行时间
- 读操作:加缓存
- 写操作:变同步写为异步写
整个下单业务都变成异步写。
  

用户请求到达 ---> 先预减库存 ---> 发送一条MQ消息 ---> 返回用户结果
MQ的作用:流量削峰

订单业务,监听MQ,执行下单操作。

核心的预减库存:利用Redis存储库存,在Redis中完成减库存操作



redis如何保证减库存的线程安全?

- 乐观锁方案:Redis事务,watch num;
- Redis的Lua脚本:原子性



前端问题:

- 页面的静态化:动静结合(部分动态数据,依然异步加载)
- 客户端缓存:304,页面缓存在客户端
- Nginx解析缓存:
- 土豪(RMB玩家):CDN服务,html、js、css、image
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 打开微信扫一扫