Skip to content

Rabbit MQ 高频面试题

公司生产环境用的什么消息中间件?

解答

公司生产环境使用的消息中间件是RabbitMQ,它是一个开源的消息代理软件,支持多种消息传递协议,具有高可用性、可扩展性和灵活的路由能力。

Kafka、ActiveMQ、RabbitMQ、RocketMQ有什么优缺点?

解答
  • ActiveMQ:优点是高并发、高吞吐、性能高,有完善的后台管理界面;缺点是社区活跃度不高,未经大规模吞吐量场景验证。
  • RabbitMQ:优点是开源社区活跃,迭代频繁,适合互联网中小公司;缺点是基于Erlang开发,源码分析和定制较难。
  • RocketMQ:优点是性能卓越,支持分布式事务,适合互联网公司大规模使用;缺点是社区可能存在不稳定风险。
  • Kafka:优点是专为高吞吐量设计,适合大数据领域;缺点是功能较少,主要用于日志采集和实时计算场景。

解耦、异步、削峰是什么?

解答
  • 解耦:系统间通过消息队列通信,降低系统间的耦合度,提高系统的灵活性和可维护性。
  • 异步:通过消息队列实现请求的异步处理,提高系统响应速度和吞吐量。
  • 削峰:在高流量时段,使用消息队列缓存请求,平滑流量高峰,保护系统稳定性。

消息队列有什么缺点?

解答

消息队列的缺点包括:

  1. 系统可用性降低:消息队列故障可能导致整个系统受影响。
  2. 系统复杂度提高:需要处理消息一致性、避免重复消费等问题。
  3. 一致性问题:在分布式系统中,消息队列可能导致数据不一致性问题。

RabbitMQ一般用在什么场景?

解答

RabbitMQ适用于需要高可靠性、灵活路由和多种消息模式的场景,如:

  • 服务间异步通信。
  • 顺序消费。
  • 定时任务。
  • 请求削峰。

简单说RabbitMQ有哪些角色?

解答

RabbitMQ中的主要角色包括:

  • Broker:消息队列服务器实体。
  • Exchange:消息交换机,负责消息路由。
  • Queue:消息队列载体,存储消息。
  • Binding:绑定,连接Exchange和Queue。
  • Routing Key:路由关键字,用于消息路由。
  • VHost:虚拟Broker,提供权限隔离。
  • Producer:消息生产者。
  • Consumer:消息消费者。

RabbitMQ有几种工作模式?

解答

RabbitMQ有以下几种工作模式:

  1. Simple模式:最简单的消息收发模式。
  2. Work模式:多个消费者竞争同一队列中的消息。
  3. Publish/Subscribe模式:发布订阅模式,消息分发到所有订阅的队列。
  4. Routing模式:路由模式,根据路由键将消息发送到特定队列。
  5. Topic模式:主题模式,使用通配符进行模糊匹配消息路由。

如何保证RabbitMQ消息的顺序性?

解答

保证RabbitMQ消息顺序性的方法包括:

  • 使用单个消费者监听单个队列。
  • 将相关业务数据发送到同一个队列中。
  • 在消费者内部实现有序处理逻辑。

消息怎么路由?

解答

消息路由通过Exchange完成,生产者将消息发送到Exchange,Exchange根据路由键将消息路由到一个或多个绑定的队列中。

如何保证消息不被重复消费?

解答

防止消息重复消费的方法包括:

  • 使用消息的唯一ID进行去重。
  • 利用RabbitMQ的确认机制(ACK),确保消息被正确处理后才从队列中删除。
  • 通过数据库或缓存(如Redis)记录已处理消息的状态。

如何确保消息接收方消费了消息?

解答

确保消息被消费的方法是使用RabbitMQ的确认机制。消费者在处理完消息后发送确认回执给RabbitMQ,RabbitMQ收到确认后才从队列中移除消息。

如何保证RabbitMQ消息的可靠传输?

解答

保证消息可靠传输的方法包括:

  • 使用持久化消息和持久化队列。
  • 开启发送方确认模式(Confirm Mode)。
  • 使用事务或发布确认。
  • 在集群模式下使用镜像队列。

为什么不应该对所有的message都使用持久化机制?

解答

对所有消息使用持久化机制可能导致性能下降,因为磁盘I/O比内存操作慢。此外,持久化机制在某些情况下可能引起数据不一致问题,如集群节点故障时的消息丢失。

如何保证RabbitMQ高可用的?

解答

保证RabbitMQ高可用的方法包括:

  • 使用镜像集群模式,消息和队列元数据在多个节点上同步。
  • 合理配置RabbitMQ的策略,如镜像队列同步策略。
  • 监控和管理RabbitMQ集群状态,及时发现并处理问题。

如何解决消息队列的延时以及过期失效问题?

解答

解决消息队列延时和过期失效问题的方法包括:

  • 设置合理的TTL(Time-To-Live)值,避免消息过期。
  • 在消息积压时,临时增加消费者数量或资源,加快消息处理速度。
  • 对于丢失的消息,通过数据重导或补偿机制恢复。

RabbitMQ中消息可能有的几种状态?

解答

RabbitMQ中消息可能的状态包括:

  • 已发送(Sent):消息已发送到Exchange。
  • 已确认(Confirmed):消息已被消费者确认。
  • 已丢弃(Discarded):消息被消费者拒绝并不再重新入队。
  • 已死信(Dead Letter):消息成为死信,可能因为TTL过期或被拒绝。

死信队列?

解答

死信队列是用于存储死信消息的队列。死信是指无法被正常消费的消息,如TTL过期、被拒绝且不重新入队的消息。

导致的死信的几种原因?

解答

导致消息成为死信的原因包括:

  • 消息TTL过期。
  • 消息被消费者拒绝并且设置requeue=false。
  • 队列达到最大长度,无法再添加新消息。