【后端面经】【消息队列】22 | 消息队列:消息队列可以用来解决什么问题?-02 超时场景+性能问题

简介: 【5月更文挑战第7天】本文介绍了电商中订单超时取消的处理方法,通过使用消息队列实现延时消息。当订单30分钟后未支付,消息队列将触发取消操作,但需注意并发问题,如采用分布式锁或乐观锁避免并发更新订单状态。乐观锁确保只有订单状态为未支付时才允许支付。主流消息队列如RocketMQ支持延迟消息,而Kafka不支持。使用消息队列的好处在于解耦和提高系统性能、扩展性和可用性。同步调用会导致性能下降,因为必须等待所有调用完成。并发调用虽可提升性能,但仍逊于消息队列,且无法解决扩展性和可用性问题。

订单超时取消

在电商里面,如果用户下单后一直没有支付,这个订单就会被取消,从而释放库存。

订单超时取消在行业里有很多种做法,在这里仅介绍使用消息队列的解决方案。

需要使用延时消息,在发送者发送以后,一段时间后,消费者才能消费的消息。

2024-05-08-20-34-39-image.png

消息队列也可以用于订单超时取消这种场景,在这种场景下,可以准备一个延时队列,比如超时时间是30min,延时就是30min。

在消费的时候要注意并发问题,也就是在30分钟这一时刻,一边用户支付,一边消费者也消费超时消息,就会有并发问题。解决思路有很多,比如用分布式锁、乐观锁,也可以使用SELECT FOR UPDATE锁住订单,防止并发操作。

2024-05-08-20-36-28-image.png

在解决并发问题的思路里,提到了数据库部分的SELECT FOR UPDATE 和 乐观锁。

乐观锁方案简单来说就是把订单更新为超时状态的时候,需要确保原始状态是未支付

UPDATE `order` SET `status`="超时未支付" 
WHERE `id`=123 AND `status`="未支付"

在支付那边也要确保只有status是未支付的时候才能发起支付。

备注:目前主流的消息队列里RocketMQ是支持延迟消息的,有插件。但是Kafka不支持。所以当面试官问你“为什么不用 Kafka”这种问题,你可以把Kafka 不支持延时消息作为理由之一。

亮点

回答为什么一定要使用消息队列?也就是不用消息队列会怎么样,用了有什么好处?

从创建订单的场景看,在订单创建后,要通知很多下游,常见的做法是发送一个订单创建的消息,然后关心订单创建的业务方各自去订阅这个消息。

-- 那为什么订单服务不直接调用各个业务方呢?

2024-05-08-20-41-48-image.png

2024-05-08-20-41-41-image.png

-- 类似的场景还有,在消息通讯里,为什么服务端不直接把消息转发给各个接收者呢?

2024-05-08-20-42-23-image.png

本质问题是:在这个业务场景下,不异步、不解耦或不削峰会有什么问题?

答案是:性能差、扩展性差、可用性差

不太好的回答就是耦合严重,面试官希望深入解释的是耦合严重会带来什么后果。

同步调用方案相比引入消息队列来说有三个缺陷,分别是性能差、可扩展性差和可用性差

性能差

性能差是因为你需要停下来等全部调用完成才可以返回响应。

2024-05-08-21-03-54-image.png

业务方必须停下来等待结果,如果我这里需要通知三个下游,那么就需要发起三次调用,并且等它们各自的结果返回之后才能继续往下执行,或者返回响应,这样性能太差了。

紧接着面试官就可能和你抬扛:“如果我并发调用呢?性能也很好啊!”他隐含的意思就是你可以开启多个线程或者协程,并发调用所有的下游。

2024-05-08-21-04-16-image.png

但是,即便是并发调用性能也比使用消息队列差

并发调用相比于使用消息队列,性能也更差。在并发调用的情况下,性能取决于最坏的那个同步调用什么时候返回结果。而正常我们丢一个消息到消息中间件上是很快的。

紧接着你可以补充一点,引出扩展性和可用性的话题。

并且,即便并发调用的性能损耗是可以接受的,但是扩展性和可用性还是解决不了。

目录
相关文章
|
5月前
|
存储 消息中间件 前端开发
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
校园圈子系统校园论坛小程序采用uni-app前端框架,支持多端运行,结合PHP后端(如ThinkPHP/Laravel),实现用户认证、社交关系管理、动态发布与实时聊天功能。前端通过组件化开发和uni.request与后端交互,后端提供RESTful API处理业务逻辑并存储数据于MySQL。同时引入Redis缓存热点数据,RabbitMQ处理异步任务,优化系统性能。核心功能包括JWT身份验证、好友系统、WebSocket实时聊天及活动管理,确保高效稳定的用户体验。
292 4
PHP后端与uni-app前端协同的校园圈子系统:校园社交场景的跨端开发实践
|
4月前
|
消息中间件 存储 大数据
阿里云消息队列 Kafka 架构及典型应用场景
阿里云消息队列 Kafka 是一款基于 Apache Kafka 的分布式消息中间件,支持消息发布与订阅模型,满足微服务解耦、大数据处理及实时流数据分析需求。其通过存算分离架构优化成本与性能,提供基础版、标准版和专业版三种 Serverless 版本,分别适用于不同业务场景,最高 SLA 达 99.99%。阿里云 Kafka 还具备弹性扩容、多可用区部署、冷热数据缓存隔离等特性,并支持与 Flink、MaxCompute 等生态工具无缝集成,广泛应用于用户行为分析、数据入库等场景,显著提升数据处理效率与实时性。
|
12月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
198 6
|
11月前
|
消息中间件
【有奖体验】解锁轻量消息队列(原 MNS)作为云产品间消息通道的典型场景
快来解锁轻量消息队列(原 MNS)作为云产品间消息通道的典型场景,赢丰厚奖品!
123 60
|
9月前
通义灵码企业级检索增强-后端注释生成代码场景DEMO
通义灵码企业级检索增强DEMO展示后端注释生成代码场景。通过上传加密算法的标准化写法(英文注释),大模型能够准确推荐企业标准写法,促进内部知识复用,并支持主动干预生成过程,提升代码规范性和一致性。
|
10月前
|
消息中间件 Kafka 测试技术
消息队列 MQ 性能大揭秘
本文对比了RabbitMQ、RocketMQ、Kafka和Pulsar四款消息队列的性能。RabbitMQ的吞吐量为万级,延迟在低吞吐量时可低至微秒级;高吞吐量下延迟显著上升。RocketMQ官方宣称支持万亿级吞吐量,实际测试中可达百万级TPS,延迟为毫秒级。Kafka和Pulsar的吞吐量均为百万级,Kafka延迟低至2ms,Pulsar延迟约10ms。总体来看,Kafka在高吞吐量下表现最优,而RabbitMQ适合对速度与可靠性要求高的低吞吐量场景。
611 0
消息队列 MQ 性能大揭秘
|
11月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
322 1
|
12月前
|
存储 缓存 持续交付
后端世界的微妙平衡:性能与可维护性的博弈###
【10月更文挑战第15天】 在软件开发的浩瀚宇宙里,后端开发犹如一颗星辰,既需璀璨夺目以支撑业务辉煌,又得稳若磐石确保系统长青。本文探讨了后端开发中性能优化与代码可维护性之间的微妙平衡,通过实例分析与策略建议,揭示了如何在追求极致速度的同时,保持代码的清晰、可读与易于迭代,实现技术与艺术的和谐共生。我们相信,正如印度圣雄甘地所言:“你必须成为你希望在世界上看到的改变。”开发者在面对复杂系统挑战时,也应主动寻求变革,探索更高效的解决方案。 ###
95 3
|
11月前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
388 0
|
JavaScript 前端开发 数据库
优化后端性能:如何使用异步编程提升系统响应速度
异步编程已成为现代后端系统性能优化的重要策略。通过避免阻塞操作,异步编程可以显著提高系统的响应速度和并发处理能力。本文章深入探讨了异步编程的基本概念,比较了常见的异步编程模型,并通过实际案例演示如何在Node.js和Python中实现异步操作,以提升系统性能。