rabbitmq小题总结

一.ampq消息协议理解?

AMQP(高级消息队列协议)是一个网络协议。rabbitmq是基于AMQP标准开发的。
在这里插入图片描述

二.rabbitmq常见的消息模式有哪些?

1.基本消息模型
在这里插入图片描述
2.work消息模型
在这里插入图片描述
3.fanout消息模型
在这里插入图片描述
4.Routing订阅模型-Direct(直连)
在这里插入图片描述
5.Routing 之订阅模型-Topic
在这里插入图片描述

三.rabbitmq在项目中你是怎么用的?

springboot整合rabbitMQ
引入依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

引入配置文件

spring:
  application:
    name: springboot_rabbitmq
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: ems
    password: 12345
    virtual-host: /ems

开发生产者

@SpringBootTest(classes = RabbitMQApplication.class)
@RunWith(SpringRunner.class)
public class TestRabbitMQ {
    @Autowired
    AmqpTemplate amqpTemplate;
    @Test
    public void sendMessage(){
        //参数1:队列名称  参数2:消息内容
        amqpTemplate.convertAndSend("hello","hello world....");
    }
}

开发消费者

@Component
@RabbitListener(queuesToDeclare = @Queue(value = "hello"))
public class RabbitMQListener {
    @RabbitHandler
    public void getMessage(String message){
        System.out.println("message=="+message);
    }
}

结构目录
在这里插入图片描述

四.rabbitmq如何保证消息在投递的过程中不被丢失

方案1开启RabbitMQ事务
可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit。
方案2 使用confirm机制
事务机制和 confirm 机制最大的不同在于,事务机制是同步的,你提交一个事务之后会阻塞在那儿,但是 confirm 机制是异步的,你发送个消息之后就可以发送下一个消息,然后那个消息 RabbitMQ 接收了之后会异步回调你的一个接口通知你这个消息接收到了。

五.如何解决消息重复消费的问题(幂等性的问题)

1.当拿到这个消息做数据库的insert操作。那就容易了,给这个消息做一个唯一主键,
那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。
2.当拿到这个消息做redis的set的操作,那就容易了,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。
3.如果上面两种情况还不行,准备一个第三方存储,来做消费记录。以redis为例,给消息分配一个全局id,
只要消费过该消息,将<id,message>以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。

六.如何解决消息堆积的问题?

1.后台定时任务每隔72小时,删除旧的没有使用过的消息信息
2.根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务,例如FIFO/LRU等
3.消息定时转移,或者对某些重要的 TAG 型(支付型)消息真正落库

七.什么是死信队列,造成死信队列的原因是什么? 如何处理死信消息?

死信队列就是没有被及时消费的消息存放的队列

原因:
1.消息被拒绝 并且不再投递
2.TTL消息超时未消费
3.达到队列最大长度

死信的处理方式
死信的产生既然不可避免,那么就需要从实际的业务角度和场景出发,对这些死信进行后续的处理,常见的处理方式大致有下面几种,
1.丢弃,如果不是很重要,可以选择丢弃
2.记录死信入库,然后做后续的业务分析或处理

八.如何实现消息限流?

1.首先第一步,我们既然要使用消费端限流,我们需要关闭自动ack,将autoAck设置为false
2.第二步我们来设置具体的限流大小以及流量
3.第三步在消费者的handleDelivery消费方法中手动ack,并且设置批量处理ack回应为true

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值