面试题:MQ

 一、常见的mq产品

RabbitMQRocketMQKafka、ActiveMQ、ZeroMQ、MetaMq

RabbitMQ: One broker to queue them all | RabbitMQicon-default.png?t=N7T8https://www.rabbitmq.com/

二、作用(面试题) 为什么用MQ?

1、异步处理

2、应用解耦

3、流量削峰

三、交换机类型(面试题

1、Direct Exchange

直连型交换机,根据RoutingKey(路由键)路由到不同的队列

2、Fanout Exchange

扇型(广播)交换机,这个交换机没有路由键概念,就算你绑了路由键也是无视的。 这个交换机在接收到消息后,会直接转发到绑定到它上面的所有队列。

3、Topic Exchange

主题交换机,这个交换机其实跟直连交换机流程差不多,但是它的特点就是在它的路由键和绑定键之间是有规则的。(开始计算

四、面试题:你们是如何保证消息不丢失的?

使用死信队列来保证消息不丢失

五、面试题Rabbitmq怎么保证消息的可靠性?

1.消费端消息可靠性保证:

1.消息确认(Acknowledgements)

消费者在接收到消息后,默认情况下RabbitMQ会自动确认消息(autoAck=true)。为保证消息可靠性,可以设置autoAck=false,使得消费者在处理完消息后手动发送确认(basicAck)。如果消费者在处理过程中发生异常或者未完成处理就终止运行,那么消息在超时时间内将不会被删除,会再次被RabbitMQ投递给其他消费者。

2.死信队列(Dead Letter Queue)

当消息不能被正常消费时(比如达到最大重试次数),可以通过设置TTL(Time To Live)或者死信交换器(Dead Letter Exchange)将消息路由至死信队列,从而有机会后续分析和处理这些无法正常消费的消息。

2.生产端消息可靠性保证:

  1. 消息持久化

当生产者发布消息时,可以选择将其标记为持久化(persistent).这意味着即使 RabbitMQ 服务器重启,消息也不会丢失,因为它们会被存储在磁盘上。

  1. 确认(Confirm)机制

开启confirm回调模式后,RabbitMQ会在消息成功写入到磁盘并至少被一个交换器接受后,向生产者发送一个确认(acknowledgement)。若消息丢失或无法投递给任何队列,RabbitMQ将会发送一个否定确认(nack). 生产者可以根据这些确认信号判断消息是否成功送达并采取相应的重试策略。

RabbitMQ作为消息中间件并启用publisher confirms(发布者确认)与publisher returns(发布者退回)机制时,可以确保消息从生产者到交换机的投递过程得到更准确的状态反馈。

### 关于消息队列(MQ)的相关面试题 以下是关于消息队列的一些常见面试题目及其解答: #### 1. RocketMQ 中 NameServer 的作用是什么? NameServer 是 RocketMQ 的寻址服务,主要用于存储 Broker 的路由信息和配置信息。它允许用户端(生产者/消费者)通过 NameServer 获取对应的 Broker 路由信息。每个 Broker 启动时都会向 NameServer 注册,而 Producer 和 Consumer 则分别依赖 NameServer 来获取 Topic 的路由信息[^2]。 #### 2. 在 RocketMQ 中,什么是 Producer Group?它的作用是什么? Producer Group 是一类 Producer 的集合名称,这些 Producer 通常用于发送同一类消息,并遵循相同的发送逻辑。其设计目的是为了防止在 RockerMQ 特有的事务消息回滚过程中,因 Producer 宕机而导致的消息丢失问题[^2]。 #### 3. 如何理解 RocketMQ 中的 Topic 和 Tag? Topic 是消息的主题,用来区分不同类型的消息,类似于邮件的地址。Tag 是消息的第二级分类标签,可以进一步细化消息类别。一个 Topic 下可以有多个 Tag,但并非强制要求使用 Tag。例如,在电商系统中,可以定义 `Order` 作为 Topic,再用 `Created`, `Paid`, 或 `Shipped` 等作为 Tag 进一步细分订单状态变化的消息[^2]。 #### 4. RocketMQ 中 Message Queue 的功能是什么? Message Queue 是消息队列的最小单位。在一个 Topic 下,可以通过设置多个 Queue 实现消息的分布式存储和水平扩展能力。当发送消息时,RocketMQ 会轮询该 Topic 下的所有 Queue 并将消息分发出去。需要注意的是,读写队列的数量应保持一致,否则可能会导致部分数据无法被正常读取。 #### 5. 消息队列有哪些常见的应用场景? 消息队列常用于异步解耦、流量削峰、日志收集等场景。例如,在高并发环境下,前端请求可以直接进入 MQ 缓冲区,而后端服务则按需逐步处理;或者利用 MQ 收集分布式系统的日志并集中分析[^3]。 #### 6. 引入消息队列后可能存在哪些弊端或风险? 虽然消息队列能够解决许多架构上的难题,但也可能带来额外复杂度、性能开销等问题。例如: - **单点故障**:如果 MQ 自身出现问题,则可能导致整个业务流程中断; - **延迟增加**:由于增加了中间层,某些实时性要求较高的操作可能会受到影响; - **调试困难**:相比同步调用方式,基于 MQ 的系统更难追踪具体执行路径[^3]。 --- ### 示例代码 以下是一个简单的 RabbitMQ 生产者实现示例: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') message = 'Hello World!' channel.basic_publish(exchange='', routing_key='hello', body=message) print(f"Sent: {message}") connection.close() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值