rabbitMQ 基础

目录

rabbitMQ的应用场景

rabbitMQ的基本结构

消息发布流程概述

rabbitMQ的基本使用

通过连接创建会话渠道(通道)

声明队列

发送消息

在管理页面里(百度自行安装)

监听消息队列

点对点模式

发布/订阅模式

声明交换机

绑定交换机和消息队列

channel通道的理解

路由模式

topics通配符模式

通配符的方式和路由模式的区别

表达式的理解

header模式

RPC模式


前言

rabbitMQ的会用发布页面作为例子

静态化页面解决方案  https://blog.csdn.net/yzj17025693/article/details/90733679

spring jms & activeMQ基础  https://blog.csdn.net/yzj17025693/article/details/90479679

 

 

rabbitMQ的应用场景

静态化页面为例,rabbitMQ就相当于一个中间件,一个代理,我们发消息发给rabbitMQ,就不需要管后面的事情了

再由rabbitMQ发给其它人.这样就解决了同步调用,以及耦合性的问题

rabbitMQ 基础

rabbitMQ 基础

 

rabbitMQ的基本结构

rabbitMQ 基础

rabbitMQ 基础

rabbitMQ 基础

 

消息发布流程概述

rabbitMQ 基础

rabbitMQ 基础

 

rabbitMQ的基本使用

生产者依赖和消费者的依赖都是相同的

rabbitMQ 基础

 

生产者方

创建的连接以及设置虚拟机,如果有第二个虚拟机那就可以叫 /v1

还可以创建不同的用户,这里用的是原始用户,不安全,(具体百度)

rabbitMQ 基础

通过连接创建会话渠道(通道)

rabbitMQ 基础

声明队列

在通道里声明队列,也就是队列的一些属性还有参数

QUEUE是我们自己定义的字符串变量,里面是hello world,这个是队列的名字,并不是消息

rabbitMQ 基础

发送消息

basicPublish方法有4个主要参数,

通过交换机,还有路由key(相当于通行证),发送消息给rabbitMQ,消息内容要转换到字节

在这之前 rabbitMQ是需要安装的,这里使用的是windows环境,rabbitMQ还有自带的管理插件(页面管理)

安装和页面管理的使用这部分内容直接百度即可

rabbitMQ 基础

 

在管理页面里(百度自行安装)

能够看到刚刚发送的消息的队列名

rabbitMQ 基础

点开后能看到基本的状态,Ready(准备就绪)是待发送的消息

rabbitMQ 基础

页面往下拉,有一个Get message 是可以拿到我们发送的消息的

rabbitMQ 基础

 

消费者方

消费者和生成者的前面部分代码是相同的,因为都需要到rabbitMQ里获取连接

rabbitMQ 基础

并且都需要声明队列,保证队列的一致性,这样不管哪一方没有启动,程序都不会报错,因为都在rabbitMQ里声明了

rabbitMQ 基础

 

监听消息队列

rabbitMQ 基础

 

这个方法是一个匿名内部类方法

第1个参数  消费者标签,用于标识消费者,可用可不用,在basicConsme就能直接指定

当我们在管理页面查看通道的时候,可以看到这个,一般用来说明这个队列的功能

第2个参数  信封,可以取得basePublish的东西,比如交换机,路由key,还有消息的id

delivery(传送)

rabbitMQ 基础

rabbitMQ 基础

 

消息确定机制(确保消息收到了)

rabbitMQ 基础

下面的代码,就相当于自动ACK,但是自动ACK并没有处理业务的能力

因为有可能我们的代码会异常

rabbitMQ 基础

手动ACK,这时候如果异常了,会消息回滚

rabbitMQ 基础

 

消息丢失

解决消息丢失

第1个是上面的消息确保机制,避免消费者丢失

第2个是消息持久化

第3个生产者确保机制

第4个发送消息钱,将消息持久化到数据库,并记录消息状态

如果rabbitMQ挂了,那么堆积在队列的消息就丢失了,所以我们可以让消息持久化

我们的mq自带的交换机默认是持久的,D是durable(持久的,耐用的)

rabbitMQ 基础

在申明交换机的时候把durable填true即可

rabbitMQ 基础

消息队列持久化

rabbitMQ 基础

但是上面只是队列的这个容器持久化,消息还没持久化

需要发送消息的时候填写prop属性

rabbitMQ 基础

rabbitMQ 基础

 

生产者确保机制

在发送消息和发送消息后调用,失败就会抛出异常信息

rabbitMQ 基础

 

 

点对点模式

有多个消费者,生成者发送一条消息,只能被一个消费者使用

上面的小例子就是类似于点对点模式

rabbitMQ 基础

rabbitMQ 基础

点对点有一个问题就是

不同的消费者处理能力不同,可能有的消费者消费的慢,有的消费者消费的快

这时候在消费慢的一方设置每个消费者同时只能处理一条消息,这样就是依能力办事

快的那个就会收到多的消息

rabbitMQ 基础

 

 

发布/订阅模式

每个消费者都能接受到同样的消息,而生产者只发送了一条

broker(经纪人,安排,交换机)

交换机没有存储消息的能力,如果没有任何队列于其绑定,活着没有符合路由规格的队列,那么消息虎会丢失

rabbitMQ 基础

rabbitMQ 基础

生产者

订阅模式,需要在生成者方指定多个消息队列

rabbitMQ 基础

声明交换机

第1个参数是一个字符串,这里我们自己声明了一个常量

Fanout(分列账户,扇)

rabbitMQ 基础

 

绑定交换机和消息队列

rabbitMQ 基础

发送消息

指定上面的交换机,而路由key为空即可(申明了交换机就会省略这个key),消息属性也为null

rabbitMQ 基础

 

消费者

依然需要声明队列,声明交换机,绑定交换机

这时候再创建一个消费者类

把队里的名称替换即可,路由不用换,因为要绑定同一个路由

rabbitMQ 基础

当生产者发送消息后

在管理页面里查看交换机,能够看到我们绑定的队列

rabbitMQ 基础

每个队列都有5条消息

rabbitMQ 基础

 

channel通道的理解

现在有2个消费者,这2个消费者是不同的消息队列

1个生产者和2个消费者,点开channel就是2个通道,一个通道绑定一个消息队列

此时,如果选中2个消费者(A和B)中其中一个,A再产生一个消费者(再运行一遍程序)A2

因为是 再运行一遍程序  所以,还是只有2个消息队列,但是有3个通道

这时候就会有2个通道绑定同一个消息队列

当生产者发送信息给消费者的时候,处于同一消息队列的2个通道会平分消息队列

而另一个通道不受影响

rabbitMQ 基础

 

 

路由模式

路由模式和订阅模式不同的是,订阅模式是随机发送给消费者的,而路由模式是可以指定的

rabbitMQ 基础

 

而路由模式是可以代替发布订阅模式的,因为routing key可以设置多个

rabbitMQ 基础

 

生产者

在发布订阅代码的基础上加上routing Key

rabbitMQ 基础

rabbitMQ 基础

绑定多个routing key

多个routing key都会接受到相同个数的消息,并不会被分割

rabbitMQ 基础

 

交换机改成direct,并且交换机名称也要和上面发布订阅的不一样,除非你在管理页面把之前创建的交换机删除了

rabbitMQ 基础

发送消息的时候也就需要指定routing key

这时候再创建一个生产者(用于测试),修改routing key即可,其它的不同变

rabbitMQ 基础

发送消息

接受者和发布订阅模式的差不多,只不过需要和上面一样绑定routing key

rabbitMQ 基础

 

 

topics通配符模式

rabbitMQ 基础

rabbitMQ 基础

rabbitMQ 基础

 

通配符的方式和路由模式的区别

rabbitMQ 基础


 

表达式的理解

在生成者端

表达式在routing key里面写,这个routing key是需要和消息队列绑定的那个

rabbitMQ 基础

 

发送消息,basicPublish里的routing key是指定发送的对象,用来匹配和消息队列绑定的那个routing key

在消费者端,只需要和消息队列绑定对应的routing key即可(带表达式的)

最下面的是设置通知2种类型的都有效

rabbitMQ 基础

 

header模式

rabbitMQ 基础

生产者端

routing key变成了空串

当下面发送消息时的headers匹配到了上面绑定的队列,就会发信息过去

rabbitMQ 基础

rabbitMQ 基础

 

RPC模式

RPC即远程调用

rabbitMQ 基础

rabbitMQ 基础