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 基础_第1张图片

rabbitMQ 基础_第2张图片

 

rabbitMQ的基本结构

rabbitMQ 基础_第3张图片

rabbitMQ 基础_第4张图片

 

消息发布流程概述

rabbitMQ 基础_第5张图片

rabbitMQ 基础_第6张图片

 

rabbitMQ的基本使用

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

rabbitMQ 基础_第7张图片

 

生产者方

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

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

rabbitMQ 基础_第8张图片

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

rabbitMQ 基础_第9张图片

声明队列

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

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

rabbitMQ 基础_第10张图片

发送消息

basicPublish方法有4个主要参数,

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

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

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

rabbitMQ 基础_第11张图片

 

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

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

rabbitMQ 基础_第12张图片

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

rabbitMQ 基础_第13张图片

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

rabbitMQ 基础_第14张图片

 

消费者方

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

rabbitMQ 基础_第15张图片

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

 

监听消息队列

rabbitMQ 基础_第16张图片

 

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

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

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

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

delivery(传送)

rabbitMQ 基础_第17张图片

rabbitMQ 基础_第18张图片

 

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

rabbitMQ 基础_第19张图片

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

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

rabbitMQ 基础_第20张图片

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

rabbitMQ 基础_第21张图片

 

消息丢失

解决消息丢失

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

第2个是消息持久化

第3个生产者确保机制

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

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

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

rabbitMQ 基础_第22张图片

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

消息队列持久化

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

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

rabbitMQ 基础_第23张图片

 

生产者确保机制

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

rabbitMQ 基础_第24张图片

 

 

点对点模式

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

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

rabbitMQ 基础_第25张图片

rabbitMQ 基础_第26张图片

点对点有一个问题就是

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

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

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

rabbitMQ 基础_第27张图片

 

 

发布/订阅模式

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

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

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

rabbitMQ 基础_第28张图片

rabbitMQ 基础_第29张图片

生产者

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

声明交换机

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

Fanout(分列账户,扇)

rabbitMQ 基础_第30张图片

 

绑定交换机和消息队列

rabbitMQ 基础_第31张图片

发送消息

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

rabbitMQ 基础_第32张图片

 

消费者

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

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

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

rabbitMQ 基础_第33张图片

当生产者发送消息后

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

rabbitMQ 基础_第34张图片

每个队列都有5条消息

rabbitMQ 基础_第35张图片

 

channel通道的理解

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

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

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

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

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

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

而另一个通道不受影响

rabbitMQ 基础_第36张图片

 

 

路由模式

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

rabbitMQ 基础_第37张图片

 

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

rabbitMQ 基础_第38张图片

 

生产者

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

rabbitMQ 基础_第39张图片

绑定多个routing key

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

 

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

rabbitMQ 基础_第40张图片

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

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

rabbitMQ 基础_第41张图片

发送消息

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

rabbitMQ 基础_第42张图片

 

 

topics通配符模式

rabbitMQ 基础_第43张图片

 

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

rabbitMQ 基础_第44张图片


 

表达式的理解

在生成者端

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

 

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

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

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

rabbitMQ 基础_第45张图片

 

header模式

生产者端

routing key变成了空串

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

rabbitMQ 基础_第46张图片

rabbitMQ 基础_第47张图片

 

RPC模式

RPC即远程调用

rabbitMQ 基础_第48张图片

rabbitMQ 基础_第49张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(java,web)