消息队列 01 - 面试官对于消息队列的连环炮

2023-12-10 22:40

本文主要是介绍消息队列 01 - 面试官对于消息队列的连环炮,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

消息队列 01 - 面试官对于消息队列的连环炮

1. 引子

消息队列分布式系统中重要的组件,一种存放消息的容器,主要作用有解耦、异步、削锋,是大型分布式系统不可缺少的中间件。

常见的消息队列有 ActiveMQ,RabbitMQ,RocketMQ,Kafka。

简历中涉及到了消息队列,面试官先问了这样几个问题:

  1. 你们系统里为什么要使用消息队列?
  2. 既然使用了消息队列,说说他还有什么使用场景?
  3. 消息队列的优缺点是什么?

2. 为什么使用消息队列?

我的回答:甲方提供 EOS 充值服务,我方进行调用。出于解耦的目的,引入了消息队列。

一个类似应试的回答方法,就是思考面试官问这个问题是出于什么目的,想获得的是什么样的答案?

当问到为什么使用消息队列时,面试官期望的回答是公司的 xxx 业务遇到了挑战,不用 MQ 会有麻烦,使用 MQ 之后带来了好处。

通过一个问题就能看出是为了用而用,还是经过思考之后使用。

3. 消息队列的使用场景?

问消息队列的使用场景,和问消息队列有什么优点,消息队列有什么作用是等价的。

消息队列的作用主要有三个解耦、异步、削峰

解耦

解耦

B,C,D 系统需要使用 A 系统产生的关键数据。

  • 无消息队列时
    • 系统 A 为系统 B、C、D 等提供各自的接口,导致系统 A 与它们紧密耦合
    • 添加系统 E 又需要接口,删除 B 系统原接口又没用了
  • 有消息队列时
    • 系统 A 作为生产者,将消息发送到消息队列
    • 系统 B、C、D 作为消费者订阅消息
    • 新增消费者只需订阅消息,对原系统和业务没有影响

异步

异步.png

用户请求数据时,系统的响应时间是保证用户体验很重要的一部分。

  • 无消息队列时
    • 用户请求 A 系统,A 系统需要等待 BCD 执行完成之后响应
    • 用户收到响应用时近 1 秒
  • 用消息队列时
    • 用户请求 A 系统,A 系统将请求推到消息队列中,B、C、D 异步执行
    • 用户收到响应用时 200 毫秒

削峰

削峰.png

秒杀场景下,每秒有 5000 个请求,Mysql 每秒最大处理 2000 条 sql。

  • 无消息队列时
    • 用户请求数据直接写入数据库,高并发时数据库压力剧增,甚至奔溃
    • Mysql 宕机,整个系统都不能用了
  • 有消息队列时系统 B、C、D
    • 用户请求数据先存入 MQ 中
    • 系统 A 每秒读取 2000 条数据进行处理
    • 每秒多出 3000 条未处理数据按场景稍后处理

4. 消息队列有什么缺点?

优点前面已经说过了,还需要讨论一下缺点。

为什么要问缺点是什么?

凡事都有两面性,如果只是考虑到消息队列的优点,而没有考虑缺点,这就是一个潘多拉的魔盒。打开魔盒,接踵而来的会是一系列的意外。

推广到引入其他技术亦然,只有考虑到缺点之后才可以采取额外的技术方案或者架构来规避这些缺点。

系统可用性降低

  • 系统引入的外部依赖越多,宕机的可能性就越大
  • 系统引入消息队列,就要考虑消息队列的可靠性
  • 比如原本只需要考虑 A,B,C,D 四个系统
  • 引入消息队列之后就需要考虑 A,B,C,D 四个系统外加消息队列

系统复杂度提高

  • 消息重复消费问题
  • 消息丢失问题
  • 消息传递顺序问题

一致性问题

  • A 系统处理完返回成功,即认为请求成功
  • 但是也存在 BC 系统写入成功,而 D 系统写入失败的情况
  • 这样的情况就是数据不一致

总结

面试官问到 MQ 的时候,希望考察我们在使用 MQ 的时候是否有过自己的思考。没有完美的技术,任何技术都具有两面性,要考虑它的使用场景,并且对可能遇到的风险做到心中有数,提前预防。

消息队列思维导图

思考

引入消息队列之后:

  • 如何保证高可用?
  • 如何避免消息的重复消费和消息丢失?
  • 如何保证消息的顺序执行?

下一篇文章一起讨论。

这篇关于消息队列 01 - 面试官对于消息队列的连环炮的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478606

相关文章

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

springboot rocketmq配置生产者和消息者的步骤

《springbootrocketmq配置生产者和消息者的步骤》本文介绍了如何在SpringBoot中集成RocketMQ,包括添加依赖、配置application.yml、创建生产者和消费者,并展... 目录1. 添加依赖2. 配置application.yml3. 创建生产者4. 创建消费者5. 使用在

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi