这个KV对存到session中模拟短信发送(仅仅将其打印出来)返回通用对象注册("/register")根据手机号从session中获取验证码若验证成功,则调用userService的注册方法(注册过程是一个事务)注册内容主要就是合法性判断,数据库的更新等等(使用MD5对密码">
赞
踩
之所以需要使用这一步,是为了防止下单接口被刷。 在前端点下下单按钮的时候,会先申请一个促销商品下单的令牌,只有获取这个令牌,才能在之后购买促销的商品
本次实战,主要也是对该下单接口进行一个优化.
使用RateLimiter对象进行限流(tryAcquire()方法如果返回false,就直接返回对应异常)
(Session检查)根据request中的UUID,尝试获取redis中的用户信息(如果获取不到说明没有登录)
(合法性检查)校验是否已经获取过“都小商品下单令牌”,并验证是否合法
生成一个库存流水(用于消息回查)
基于rocketmq,调用消息服务,发送一条事务消息。
executeLocalTransaction
),执行本地事务,这里其实就是将本地事务的执行和消息的发送绑成了一个事务,若本地事务执行成功,则消息才能发送成功,若本地事务执行失败,则消息回滚,依然对消费者不可见。checkLocalTransaction
), 会根据库存流水的状态,来决定当前消息的状态。 即具体逻辑就是,传入的参数里有库存流水ID,根据这个ID去查询对应的下单流水信息,如果status状态是1的话,就说明是正在等待处理,依然是unknown,如果是2的话,则说明已经处理完了,直接返回commit,如果是3的话,说明发生了回滚,就返回回滚状态.另一端:
时间极短, 瞬间用户量大, 出现缓存雪崩,缓存击穿,缓存穿透等情况,打挂DB可能会造成系统的联级失效。
单独提供一个秒杀服务模块,数据库也采用分库的思想,单独提供一个秒杀库。 这样做的好处就是即使秒杀库挂了,服务挂了,也不会影响到其他业务。
单机的Redis顶不住高并发的问题可以通过搭建Redis集群来解决,写master,读slave,然后开启哨兵模式,开启持久化保证高可用。
一台ngix服务器负责反向代理,多台web服务器提供服务。
就比如现在库存只剩下1个了,我们高并发嘛,4个服务器一起查询了发现都是还有1个,那大家都觉得是自己抢到了,就都去扣库存,那结果就变成了-3,是的只有一个是真的抢到了,别的都是超卖的。
考虑的点:
Q: 库存预热:
A: 这个一般给运营人员去做吧。。手动将秒杀商品的库存加载到redis里面,在规模比较大的时候的话,可以专门写一个这种管理平台系统吧…
Q: 扣减库存怎么保证线程安全:
A: 项目里是通过分布式锁来去做的(todo 实现一下分布式锁), 就是向上提供一个查询接口,如果获取不到锁就自旋…
Q: 缓存击穿
A: redis预热、永不失效、本地缓存或第三方缓存、限流策略…
Q: 客户的恶意下单怎么防范
A: 秒杀令牌机制。 其他还有: 验证码,封ip(nginx有个设置项,单个ip访问的频率和次数多了之后有个拉黑操作…服务端写逻辑封用户?),(接口隐藏 )秒杀前将下单接口置灰,使获取不到下单接口… 或者也可以限制同一个用户的最大下单数?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。