提前拜谢老师!
我看本章的思路大体上是
mq 第一次削峰,然后 Redis 自减库存后,实际数据库的 IO 操作交给 Redis 队列异步化处理。也就是说,把数据放进 Redis 队列后,其实就可以给结果了。如果上游业务方是直接通过接口的方式调用,相当于可以直接返回一个结果,成功与否。
- 问题 1:但是如果上游是通过 MQ 的方式投过来的,那么如何通知上游业务方呢。再投一个 MQ 回去吗(是不是不好对应某次请求)。
- 问题 2:所以,是否把 Redis 放在前面比较合理呢,上游业务方,直接访问接口, redis 扣减库存(Redis 本身也很能抗吧,也没什么业务,只有一个 redis 扣减操作),然后就给返回值,即成功与否。然后我们自己再把数据放到一个 MQ 中,用 MQ 去缓冲下,然后用少量线程去消费 MQ,或者消费加个限速,然后去写数据库。
- 问题 3:为什么要实现一个 Redis 的队列,然后去拉取,再反射调用呢。比如用 CompletableFuture runAsync 等 ,去异步处理不可以吗。也能做到快速返回是不是(思考)。
- 问题 4:秒杀场景下,Redis 中数据的操作是不是还需要用分布式锁,以及幂等的方式,防止重复请求,以及多线程下的非原子操作的问题。
- 问题 5 :如果写 DB 的操作失败了,是不是可以考虑再投到一个 MQ,做一个延迟重试队列(就是想请教老师,既然提前给了业务方执行结果,然后异步处理写数据库的操作,如何保证后续操作一定成功呢,如果出现了 DB 的问题,就可能最终数据不一致了)。
问题有点多,有的思考的可能也有漏洞,比较白,但是确实是自己的一些疑惑,希望老师有空给指导下。万分感谢老师!