消息中间件(RabbitMQ)面试题

RabbitMQ-如何保证消息不丢失?

  • 开启生产者确认机制,确保生产者的消息能到达队列
  • 开启持久化功能,确保消息未消费前在队列中不会丢失
  • 开启消费者确认机制为auto,由spring确认消息处理成功后完成ack
  •  开启消费者失败重试机制,多次重试失败后将消息投递到异常交换机,交由人工处理

RabbitMQ消息的重复消费问题如何解决?

每条消息设置一个唯一的标识id

幂等方案:【分布式锁,数据库锁(悲观锁、乐观锁)】

 RabbitMQ中死信交换机?延时队列有了解过吗?

业务场景(超时订单、限时优惠、)

 其中延迟队列就是用到了死信交换机和TTL(消息存活时间)实现

消息超时未消费就会变成死信(死信的其他情况:拒绝被消费,队列满了)

 延迟队列插件实现延时队列DelayExchange

  • 声明一个交换机,添加delayed属性true
  • 发送消息时,添加x-delay头,值为超时时间

RabbitMQ如果有100万消息堆积在MQ、如何解决(消息堆积怎么解决) 

当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,知道队列存储消息到达上限,之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题

解决消息堆积有三种思路:

  • 添加更多消费者,提高消费者速度
  • 在消费者内开启线程池加快消息处理速度
  • 扩大队列容积,提高堆积上线
    • 在声明队列的时候可以设置属性x-queue-mode为lazy,即为惰性队列
    • 基于磁盘存储,消息上限高
    • 性能比较稳定,但基于磁盘存储,受限于磁盘IO,时效性会降低

RabbitMQ的高可用机制

镜像队列结构是一主多从(从就是镜像),所有操作都是主节点完成,然后同步给镜像节点

主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就宕机,可能出现数据丢失)

那出现丢失数据怎么解决?

我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于Raft协议,强一致。并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定这个是仲裁队列即可

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值