RabbitMq消息队列----学习整理

1.下载安装:https://blog.csdn.net/qq_38931949/article/details/95513014

2.初步了解,开头随便瞥一眼,有个印象就行:https://www.sohu.com/a/301400501_652662

3.RabbitMq服务器使用:https://blog.csdn.net/qq_31072669/article/details/84789715

4.视频学习:如果赶时间用,可以直接看第三个链接Springboot整合RabbitMQ的部分

(应用场景讲得好)https://b23.tv/UTDCvJ

(各种消息模式讲得好)https://b23.tv/D9xMbz

(Springboot整合RabbitMQ讲得好)https://b23.tv/bVMxwU 


笔记


1.简单队列:一个消费者,一个队列,一个生产者。

2.工作队列:(轮询分发):一个生产者,一个队列,多个消费者处理。
轮询分发:消费者公平消费。接收导的消息数量一致(若为偶数条消息)

  工作队列:(能者多劳):发送端必须使用公平分发(发送端一次发一个,接收端一次接收一个。);接收端必须关闭自动应答ACK,改成手动。
能者多劳:消费者能力处理消息速度快的,接收到的消息越多。

 /**
         * 每个消费者发送确认消息之前,消费队列不发送下一个消息到消费者,一次只处理一个消息
         *
         * 限制发送给同一个消费者 不得超过一条消息
         */
        int prefetchCount=1;
        channel.basicQos(prefetchCount);channel.basicQos(1); //确保一次只发一个
channel.basicAck(envelope.getDeliveryTag(),false);//手动回执,返回个标记,说明已消费
boolean autoAck = false;//关闭自动应答
        channel.basicConsume(QUQUQ_NAME,autoAck,consumer);//监听

3.订阅模式:一个生产者生产一个消息,多个消费者消费。
一个生产者,多个消费者。
每一个消费者都有自己的队列。
生产者没有直接把消息发送到队列上 而是发送到交换机 转发器 exchange
每个队列都要绑定到交换机上。
生产者发送消息 经过交换机 到达队列 就能实现一个消息被多个消费者消费

注意:若不将消息队列绑定到交换机 消息会丢失 因为交换机没有存储能力 只有队列能存储消息

交换机 转发器 exchange
一方面接收生产者的消息 另一方面向队列推送消息

channel.basicPublish(EXCHANGE_NAME,"",null,msg.getBytes());
“ ” :匿名转发
null:路由关键字

channel.exchangeDeclare(EXCHANGE_NAME,"fanout"); //交换机名称、类型;fanout分发
fanout(不处理路由键):只要和交换机绑定的消息队列都能收到消息
Direct(处理路由键)

关于消息持久化:防止rabbitMq挂了或杀死正在执行的消费者,使消息丢失,重建了个地方存放消息。

//声明队列
boolean durable = false;//是否持久化,false是不持久
channel.queueDeclare(QUQUQ_NAME,durable,false,false,null);

注意:不能在一个已经申明过的队列里,修改持久化参数的值,rabbitMq不允许。
    想要修改:去rabbitMq服务器删掉这个队列/或修改队列名,重建一个队列。

4.路由模式:
在输入时绑定一个路由关键字,消息队列也绑定一个
二者通过关键字有选择的接收消息

生产者先将交换机类型设置为direct(处理路由)类型,且发布消息的时候,以路由关键字的方式发布
消费者通过路由交换件的方式,将消息队列绑定到路由器

//exchange类型为direct,处理路由类型
        channel.exchangeDeclare(EXCHANGE_NAME,"direct");
 String routingKey="error";//路由键
        channel.basicPublish(EXCHANGE_NAME,routingKey,null,msg.getBytes());

 //以路由关键字“error”,绑定队列到交换机
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"error");
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"info");
缺陷:关键字必须明确,若对于一类有着明确主题的消息队列,它需要写一堆关键字。

8.主题模式
将路由键和某个模式进行匹配

# 匹配个或多个
* 匹配一个
Good.# : Good.update Good.insert...

9.消息确认机制(事务+confirm)
在rabbitMQ中 通过持久化数据数据 解决rabbitmq服务器异常 的数据丢失问题

问题:生产者将消息发出之后,消息到底有没有到达rabbitMQ服务器 默认的情况是不知道的

两种方式:
    AMQP实现事务机制
    Confirm模式

事务机制:
txSelect bxCommit txRollback
txSelect:用于将用户当前channel设置成transa模式
txCommit:用于提交事务
txRollback:(提交前如果出现异常,可以使用)回滚事务


关于Springboot整合RabbitMQ的使用

1.配置RabbitMQ环境
注意:可以在RabbitMQ服务器中,针对不同的服务,建立不同的用户、虚拟机,使得各功能相互独立
2.RabbitTemplate模板对象类:用来简化rabbMq的操作 使用的时候直接在项目中注入
3.注意:
光创建发送端,是无法创建交换机或消息队列的,没有消费者没意义
spring AMQP:实现work队列的方式默认是公平分发,若需要能者多劳需要额外配置
4.pub/sub 
相当于广播,通过交换机将消息传到所有消息队列,使用户都能接受到相同消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值