22|消息队列:消息队列可以用来解决什么问题?
前置知识
- 深入了解
- 翻译
- 解释
- 总结
消息队列在构建高并发、高可用系统中扮演着重要角色,具有异步、削峰、解耦等特性,适用于日志处理、消息通讯、事件驱动架构等场景。在面试准备中,了解公司使用消息队列的优缺点,并准备相关案例是至关重要的。强调消息队列在解决异步、解耦和削峰需求方面的重要性。文章还介绍了消息队列的优点,包括性能、扩展性和可用性,以及事件驱动模式的优势。最后,提出了基于事件驱动的SAGA分布式事务方案,强调事件驱动在解决复杂业务问题方面的价值。整体而言,本文深入探讨了消息队列的重要性和应用场景,以及事件驱动模式的优势,为读者提供了深入了解和应用的指导。
《后端工程师的高阶面经》,新⼈⾸单¥59
全部留言(11)
- 最新
- 精选
- 子休除了我这里列举的消息队列使用场景,你还见过哪些很有特点的使用消息队列的场景? 答:上家公司,我所在的中台基础服务组,实现了一个叫“事件中心”的微服务,核心功能之一就是使用消息队列作为事件传递和调用。相较于正常的消息传递,这个服务相当于把消息队列包了一层,可以提供比消息队列更多的功能,比如统计,审计等,因为代码是掌握在自己手中,可以做更多的事情。 面试中还有一个比较经典的问题,就是你为什么用 Kafka、RabbitMQ 或 RocketMQ,又或者说你为什么使用某一个中间件,这种问题该怎么回答呢? 答: 1. 先大致描述一下各种中间件的优点和缺点,这些基本都是随便搜搜就知道了。 2. 然后结合项目中的业务场景特点,说出自己的看法,比如这个中间件用在自己的业务里面会有什么益处,会有什么弊端等等。 3. 告诉面试官,自己在技术选型的时候,写了一些demo,在测试环境跑了下,结果如何如何,最后敲定了其中一个。之后,经过技术评审,大家认可了自己的看法,一致通过。 4. 选好中间件之后,选择一个业务组进行接入,通过充分测试之后,开始上线试运行,结果大致良好。只是中间出了一些小问题,由此可以引出一些你自己对这个中间件的常见问题的解决思路。比如消息丢失是怎么解决的?消息积压是怎么解决的。 5. 最后收尾的时候,如果可能的话,可以升华一下,自己对这个中间件的高维度认知。比如虽然你只是在这个公司用了消息队列来解决削峰解耦的事情,但是其实消息队列还可以用在很多地方。比如本文中提到的分布式事务。
作者回复: 6666,你是懂面试的!
2023-08-07归属地:上海24 - sheep面试官假若问:"我调用第三方业务,直接启动一个协程去调用,但是并不关心返回值,直接返回信息给用户了",怎么样回答,才能证明使用消息队列才是性能更好的方案呢。我想这里其实不关心返回值的话,其实也不用消息队列了吧
作者回复: 协程你终究还是堵在了这台机器上,如果并发高的话,你这里协程就很有问题。 另外一个就是,引入消息队列,你的性能瓶颈就是消息队列的瓶颈,数十万上百万的 QPS 都没问题。但是你一台机器是开不出来数十万上百万的协程的。
2023-11-28归属地:广东22 - 程序员花卷除了我这里列举的消息队列使用场景,你还见过哪些很有特点的使用消息队列的场景? 比如使用RocketMQ的事务消息来解决分布式事务的问题,保证数据的最终一致性。 具体场景就拿文中的例子来举例:扣减库存 和 创建保存订单这两个操作是位于不同的服务的,那么就涉及到了分布式事务的问题,大体思路是当缓存库存扣减完成之后,就发送事务消息到Broker,这个事务消息执行的业务就是创建并保存订单,事务消息发送成功之后就会执行本地事务,本地事务对应的业务操作就是扣减数据库库存,当本地事务执行完之后,如果成功就COMMIT,否则就ROLLBACK,让Broker真正投递事务消息,订单服务那边创建并保存订单。如果在创建并保存订单的过程中出了问题,那么就需要利用RocketMQ发送一条普通消息到商品服务,商品服务这边要做两个事情:一个是还原缓存库存,一个是还原数据库库存。这样就保证了最终一致性。 需要注意的问题: 1. 需要保证扣减商品库存、还原商品库存、创建并保存订单的幂等性 2. 如果订单创建并保存失败后服务就挂了,导致还原库存的消息没发出去,怎么办,针对这种情况可以设计一个异步检测的服务,使用一个下单业务记录表来记录下库存扣减和创建订单的业务,然后使用这个异步检测服务去定时扫描检查,但凡出现某个业务扣减过库存但是没创建保存过订单,那就将缓存库存和数据库库存还原回来,并记录下这个异常情况,方便后期核查!
作者回复: 可以的,赞!
2023-12-08归属地:云南 - sheep,“基本思路->秒杀场景”这里扣减库存时候订单服务不是已经通过消费消息队列,来进行创建订单了么。这里后续的“订单超时取消”,又是如何应用上的呢,是客户端又发了一个延时消息吗,来告诉指定订单30分后“未支付”则进行取消?
作者回复: 创建订单的时候再发一个超时未支付的消息就行。
2023-11-29归属地:广东2 - sheep回答课后问题: 1. 使用消息队列来进行削峰,比如某项目就用kafka来缓解往ES插入数据的压力 2. 组内好像没有使用到消息队列,但是了解其他部门有使用,主要是在第三方业务服使用公用ES时候,使用kafka来缓解ES的压力吧,而且kafka的吞吐量会比其他消息队列好很多
作者回复: 对!所以你可以考虑刷个 KPI。
2023-11-28归属地:广东 - KK请问一下老师,这个步骤是怎么实现提示用户支付的呀,通过API还是什么操作? “订单服务会从消息队列里面将请求拿出来,真正创建订单,并且提示用户支付”。
作者回复: 可以通过回调,也可以再次借助消息队列。我猜测你是指前端怎么知道的吧?这个可以用websocket,而 APP 之类的也可以考虑用 gRPC。
2023-11-01归属地:北京3 - KKpulsar 与 kafka 会选择哪一个?
作者回复: 我一般都是无脑选 Kafka,万一同事喷我,我也可以说我做的是最保守的选择。
2023-10-31归属地:北京2 - Geek8004轻问老师,秒杀系统里面需要用分布式锁锁住redis的库存吗?我理解不用分布式锁,因为redis在读写key的时候其实是单线程的.没有并发问题
作者回复: 直接用 Redis 来扣减内存的话,不需要分布式锁。
2023-08-30归属地:中国香港2 - ZhiguoXue_IT对于大数据量的mq,大多数会选择kafka,高吞吐量,作者是如何认为的
作者回复: 我认为无脑选 Kafka,哈哈哈哈。就这么说,就是虽然别的 MQ 有一些很方便的功能,但是总的来说并不构成强有力的选型理由。而 Kafka 社区支持,文档都非常成熟。 即便是从混职场的角度来说,选 Kafka 肯定没人敢说你选得不对。 就我个人来说,我其实觉得性能并不是决定性的选型因素,虽然重要,但是也没特别重要。
2023-08-14归属地:北京 - peter请教老师一个问题:kafka是用户大数据的消息队列,有没有这个说法?
作者回复: 我没看懂,啥叫做用户大数据的消息队列?
2023-08-07归属地:北京2