请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

秒杀场景先用 mq 还是先用 redis?

提前拜谢老师!
我看本章的思路大体上是
mq 第一次削峰,然后 Redis 自减库存后,实际数据库的 IO 操作交给 Redis 队列异步化处理。也就是说,把数据放进 Redis 队列后,其实就可以给结果了。如果上游业务方是直接通过接口的方式调用,相当于可以直接返回一个结果,成功与否。

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

问题有点多,有的思考的可能也有漏洞,比较白,但是确实是自己的一些疑惑,希望老师有空给指导下。万分感谢老师!

正在回答 回答被采纳积分+3

1回答

洛神灬殇 2022-11-14 23:39:39

首先,老师给你点个大大的赞,一看就是用功学习了,看的很仔细,头脑很聪明,技术也不错哈,针对于问题,老师给出的建议如下。

问题1针对于通知机制可以通过您所说的,反向订阅绑定,或者采用本地消息表采用单独的通知机制进行通知,这是之前我们公司常用的方式之一,此外不好对应某次请求的话比较简单学习一下dubbo的思路,建立绑定对应的requestid也是可以的,考虑回调和解除阻塞的两种方式即可。mq也有很多问题比如说消息的顺序问题

问题2.首先redis的qps和tps还是与主流的mq有一定差距,此外最重要的就是mq当出现网络波动和超时时候,会有对应的策略比如说重启,警告等。还有就是mq本身而言内部有很多限流机制,例如rocketmq,可以大幅度削峰,水平扩展和垂直扩展的所带来的效果和成本也会比redis好,而且伴随着redis的处理慢慢会有rss和内存碎片的出现,会导致性能下降,而且内存使用率上来了,redis的客户端的连接工具出现了连接池占满也会存在着问题所在导致数据丢失,也会出现一些奇奇怪怪的block client.毕竟它以AP为主,综合考虑选择了mq一马当先。当然还有很多,其他的因素在里面,因为太多了,所以老师就不一一列举了,如果有兴趣的话可以一起探讨一下。

但是同学说的也没有错,在一般情况下来讲,用redis开头也是没问题的,但是在大型场景,来讲可能就不行了。

问题3是这样子的,其实使用线程池的方式也是没有问题的,但是问题就是在于一旦服务当机了那么任务对接里的东西以及异步处理的任务都会丢失,此外,线程池队列的大小也是一个问题,设置过大容易出现内存问题设置过小会任务的执行造成影响甚至丢失任务,而使用redis做队列便不会受到影响,因为redis队列的大小非常的大。最重要这个是老师在工作当中的一个企业级的主见,现在已经在公司上上下下进行使用了那么这种组件老师去其糟粕取其精华将核心的东西啊,抽取出来形成了一种框架。希望大家可以学习其中的设计思路和想法。慎子针对于排队的机制也可以实现插队模式而不只是单纯的FIFO的机制。这也是rocketmq也存在的问题。

问题4.是这样子的,当时考虑到主要是基本的实现,其实要保证原子性最好的方案是采用lua脚本,分布式锁还是太重。幂等性的考虑是对的但是如果只是单纯原子操作就不需要考虑了,加速的目的是保证一致性保证保证数据库和其他服务之间的一致性,幂等性最头疼的地方在于新增操作,后面的升级老师会将他们完善的更加理想,

问题5,同学说的特别好,考虑的很周全,确实会出现此问题,后面的课程章节,老是会引入分布式事物和rocketmq的事务性消息,来进行把控。还有很多其他的优化还没开始呢,哈哈,前期简单是为了给后面的优化做铺垫。哈哈,同学看的很好,很仔细,👍🏻。 这些同学的关注,一样我们一起加油!

老师的答案不知道是否解决了您的疑惑,如果还有问题,请及时和老师沟通,谢谢。

0 回复 有任何疑惑可以回复我~
  • 分布式锁其实效果还不如我们的分布式队列的效果,配合着原子性能力,主要考虑幂等性的新增操作就可以了,保证最终一致性性哈
    回复 有任何疑惑可以回复我~ 2022-11-14 23:42:47
  • 提问者 二境志 #2
    非常感谢老师这么晚还给出解答,老师回答的非常详细,对我很有帮助,我明天好好消化一下,把这块的核心思路和一些一要点内容吃透,再接着学习后面的内容!!! 再次感谢!
    回复 有任何疑惑可以回复我~ 2022-11-14 23:51:07
  • 客气客气了
    回复 有任何疑惑可以回复我~ 2022-11-26 19:48:43
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信