05-RabbitMQ 面试题-mk

莱莱  论坛元老 | 2025-4-13 20:23:49 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1863|帖子 1863|积分 5589

1.RabbitMQ 核心组件及功能详解

RabbitMQ 核心组件及功能详解
2.RabbitMQ-如何保证消息不丢失?

消息中心件的长处


  • 提供了系统之间的异步调用,让服务与服务之间解耦
  • 削峰、填谷
场景:


  • 异步发送(验证码、短信、邮件…)
  • MySQL和Redis , ES之间的数据同步
  • 分布式事务
  • 削峰填谷

消息发送者(publisher )把消息发送给交换机(exchange),由交换机路由到队列,最后由消耗者(consumer)举行消耗消息。
出现消息丢失的四种情况:


  • 消息未到达交换机
  • 消息未到达队列
  • 队列中消息丢失
  • 消耗者未接收到消息
生产者确认机制(办理消息未到达交换机、消息未到达队列题目)
RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果(ack)给发送者,表示消息是否处理乐成

假如消息发送失败,有两种情况:


  • 消息到达交换机失败(publisher-confirm nack)
  • 交换机路由到队列失败(publisher-return ack)
消息失败之后如何处理呢?


  • 回调方法即时重发(知道哪一个消息发送失败,可以再发)
  • 记录日志(假如还是发送失败,可以记录日志,通过查看日志举行赔偿)
  • 保存到数据库然后定时重发,乐成发送后马上删除表中的数据
假如重发失败了怎么办?


  • 一样平常消息发送失败了,很大几率是服务提供者宕机了或者是MQ宕机了,这两者不可能一直处于宕机状态。
  • 假如还是不能办理,需要人工来办理这些题目
消息已经正常发送到队列,但是MQ 宕机了,也会导致消息丢失,该怎么办理?
消息持久化(办理队列中消息丢失题目)
MQ默认是内存存储消息,开启持久化功能可以确保缓存在MQ中的消息不丢失。(MQ宕机或重启后,在内存中的消息肯定会丢失,需要持久化)
1.交换机持久化:
  1. @Bean
  2. public DirectExchange simpleExchange(){
  3.      
  4. // 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除
  5. return new DirectExchange("simple.direct", true, false);
  6. }
复制代码
2.队列持久化:
  1. @Bean
  2. public Queue simpleQueue(){
  3.         
  4. // 使用QueueBuilder构建队列,durable就是持久化的     
  5. return QueueBuilder.durable("simple.queue").build();
  6. }
复制代码
3.消息持久化,SpringAMQP中的的消息默认是持久的,可以通过MessageProperties中的DeliveryMode来指定的:
  1. Message msg = MessageBuilder
  2. .withBody(message.getBytes(StandardCharsets.UTF_8)) //消息体
  3. .setDeliveryMode(MessageDeliveryMode.PERSISTENT) //持久化
  4. .build()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表