1、为什么使用消息队列?
其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在 这个场景里用消息队列是什么?
面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场 景有个什么技术挑战,如果不用 MQ 可能会很麻烦,但是你现在用了 MQ 之后带给了你很 多的好处。消息队列的常见使用场景,其实场景有很多,但是比较核心的有 3 个:解耦、异 步、削峰。
解耦: A 系统发送个数据到 BCD 三个系统,接口调用发送,那如果 E 系统也要这个数据呢?那 如果 C 系统现在不需要了呢?现在 A 系统又要发送第二种数据了呢?而且 A 系统要时时刻 刻考虑 BCDE 四个系统如果挂了咋办?要不要重发?我要不要把消息存起来? 你需要去考虑一下你负责的系统中是否有类似的场景,就是一个系统或者一个模块,调 用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不 需要直接同步调用接口的,如果用 MQ 给他异步化解耦,也是可以的,你就需要去考虑在你 的项目里,是不是可以运用这个 MQ 去进行系统的解耦。
异步: A 系统接收一个请求,需要在自己本地写库,还需要在 BCD 三个系统写库,自己本地写 库要 30ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 30 + 300 + 450 + 200 = 980ms,接近 1s,异步后,BCD 三个系统分别写库的时间,A 系统就不再考虑了。
削峰: 每天 0 点到 16 点,A 系统风平浪静,每秒并发请求数量就 100 个。结果每次一到 16 点 ~23 点,每秒并发请求数量突然会暴增到 1 万条。但是系统最大的处理能力就只能是每秒钟 处理 1000 个请求啊。怎么办?需要我们进行流量的削峰,让系统可以平缓的处理突增的请 求。
2、消息队列有什么优点和缺点?
优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰。 缺点呢?
系统可用性降低 :系统引入的外部依赖越多,越容易挂掉,本来你就是 A 系统调用 BCD 三个系统的接口 就好了,ABCD 四个系统好好的,没啥问题,你偏加个 MQ 进来,万一 MQ 挂了怎么办?MQ 挂了,整套系统崩溃了,业务也就停顿了。 系统复杂性提高 硬生生加个 MQ 进来,怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保 证消息传递的顺序性?
一致性问题: A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,你这数据就不一致 了。
所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来 的坏处做各种额外的技术方案和架构来规避掉。
3、常见消息队列的比较
4、Kafka 的特性
1.消息持久化 2.高吞吐量 3.扩展性 4.多客户端支持 5. Kafka Streams
5、RabbitMQ 中的 vhost 起什么作用?
虚拟消息服务器,vhost,本质上就是一个 mini 版的 mq 服务器,有自己的队列、交换 器和绑定,最重要的,自己的权限机制。Vhost 提供了逻辑上的分离,可以将众多客户端进 行区分,又可以避免队列和交换器的命名冲突。Vhost 必须在连接时指定,rabbitmq 包含缺 省 vhost:“/”,通过缺省用户和口令 guest 进行访问。
rabbitmq 里创建用户,必须要被指派给至少一个 vhost,并且只能访问被指派内的队列、 交换器和绑定。Vhost 必须通过 rabbitmq
6、RabbitMQ 上的一个 queue 中存放的 message 是 否有数量限制?限制是多少
默认情况下一般是无限制,因为限制取决于机器的内存,但是消息过多会导致处理效率 的下降。
可以通过参数来限制, x-max-length :对队列中消息的条数进行限制 , x-max-length-bytes :对队列中消息的总量进行限制
7、说一说 Kafka 你熟悉的参数?
必选属性 创建生产者对象时有三个属性必须指定
标签:面试题,2024RabbitMQ,队列,系统,BCD,MQ,消息,写库 From: https://blog.csdn.net/pujungong/article/details/140094837