记录两周学习RabbitMq获得的东西

147 阅读3分钟

rabbitMq 消息队列

作为众多消息队列的一种,用来存储消息、中转消息的一个中间件,可以用来处理 解耦、削峰等问题。

组成部分:

生产者(producer):生产者用来发送消息记录,可以是记录订单的业务唯一不重复的id(不重复 后面可以用来消息接收不到 重复消费问题), 发送到MQ(由交换机exchange、quene队列组成)中,由消费者进行消费。

交换机(exchange):用来接收生产者通过connection中的信道(channel)进行连接发送信息到交换机中,交换机通过rounting Key 与队列进行绑定, 绑定有四种:

  1. fanout扇出模式(可以不指定路由Key),只要与交换机进行绑定的队列,都会进行广播消息

  2. Direct直接的:要求消息带的路由键和绑定的路由键完全匹配,这是一个完整的匹配

  3. topic主题:主题类型交换机 将路由键和某模式进行匹配。此时队列需要绑定某一个模式上。符号#匹配0个或多个单词,符号 *匹配一个单词。

  4. headers头部的模式:这种不常用,可以选择性忽略

    队列(quene):队列与消费者又更进一步的练习,每条消息可以被消费者消费一次,也可以被消费多次

    消费者(consumer):获取对应队列中的消息进行消费。

业务

消息的等待确认 单个确认 一个一个进行确认 批量确认 全部发送之后 在进行确认 异步确认:使用回调函数记录成功或失败的数据 队列或消息是否持久化 发布应答 死信队列: 消息TTL过期/超过队列最大限制数/消息被拒绝, 在@Bean注入普通队列的时候写入Map参数 绑定死信队列的队列名称 路由key confirmCallBack 回调函数 退回函数:进行重写RestTemplate.callback方法

基本延迟队列: 在配置队列的时候,写入指定的过期时间,测试消费者的效果,有一个问题就是消息队列 先进先出,可能第一个过期时间长,第二个过期时间短,但是结果显示还是 第一条 第二条的顺序 基于插件的延迟队列:在配置交换机的时候设置过期时间,避免上面的问题

发布确认 使用springboot实现消息队列

定义一个配置类: 注入队列,注入交换机,绑定队列到交换机中

消息确认的回调:重写RabbitTemplate的confirmCallback方法记录哪一个交换机收到消息,哪一个未收到消息 回退函数:重写RabbitTemplate的ReturnCallback方法 注意:因为重写了上面的两个方法,想要设置生效的话,需要重新在该类中通过注解的方式注入RestTemplate 并重新赋值该两个方法

注意写的顺序
此处有一个类被@conponet修饰注入spring容器中

@Resource
privae RestTemplate restTemplate;
// 该注解是后置处理器
@PostConstruct
public void init() {
restTemplat.setConfirmCallback(this);
restTemplat.setReturnCallback(this);
}

备份交换机 由于普通的交换机无法进行发送消息(可能是网不好,绑定的路由key,交换机名称不对导致的原因),就把无法投递的消息写给备份交换机,进行发送给给报警的消费者

优先级队列:可以在代码中配置 进行argument参数中配置 惰性队列: 一般是保存在磁盘中,不占内存,性能好;例如当消息的堆积时。 写的不全哈 作者也是新学习的