对于对于这 5 个步骤来说,能否决定秒杀成功,实际上只有风险控制和库存锁定这 2 个步骤。只要用户的秒杀请求通过风险控制,并在服务端完成库存锁定,就可以给用户返回秒杀结果了,对于后续的生成订单、短信通知和更新统计数据等步骤,并不一定要在秒杀请求中处理完成。
对于超时的请求可以直接丢弃,APP 将超时无响应的请求处理为秒杀失败即可。
实现的方式也很简单,不需要破坏原有的调用链,只要网关在处理 APP 请求时增加一个获取令牌的逻辑。
令牌发生器按照预估的处理能力,匀速生产令牌并放入令牌队列(如果队列满了则丢弃令牌),
网关在收到请求时去令牌队列消费一个令牌,获取到令牌则继续调用后端秒杀服务,如果获取不到令牌则直接返回秒杀失败。
消息队列的另外一个作用,就是实现系统应用之间的解耦
消息队列最常被使用的三种场景:异步处理、流量控制和服务解耦。
当然,消息队列的适用范围不仅仅局限于这些场景,还有包括:
作为发布 / 订阅系统实现一个微服务级系统间的观察者模式;
连接流计算任务和数据;
用于将消息广播给大量接收者。
同时我们也要认识到,消息队列也有它自身的一些问题和局限性,包括:
引入消息队列带来的延迟问题;
增加了系统的复杂度;
可能产生数据不一致的问题。
来源:https://www.cnblogs.com/lakeslove/p/12291431.html