MQ(消息队列)

MQ全称为Message Queue,是一种应用程序对应用程序的通信方法,应用程序通过读写出入消息队列的数据来通信,从而无需专用连接来链接他们(如RPC)。

消息队列是典型的生产者和消费者模型,生产者和消费者只关心消息的发送和接受,没有业务逻辑的侵入,实现了生产者和消费者的解耦。

 

AMQP:一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息中间件设计。

JMS:实际指JMS API,是由sun公司早起提出的消息标准,意在为java应用提供统一的消息操作,包括create,send,receive。

 

AMQP与JMS的区别:

JMS定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交换的格式。

JMS限定了必须使用java语言;AMQP只是协议不规定实现方式,因此是跨语言的。

JMS规定了两种消息模型;AMQP的消息模型更加丰富。

 

常见的MQ产品

 rabbitMQ是一个开源的MQ产品:

  1.安装

           配置erlang,配置官方的配置文件后在使用yum install erlang,进行安装(否则直接安装的erlang 和新版的rabbitmq要求的版本不匹配)

          下载rabbit的rpm 安装包,使用rpm进行安装

  2.安装完成后

         service rabbitmq-server start  --启动服务

   rabbitmq-plugins enable rabbitmq_management  --enable网页版管理插件
(默认的guest只能通过localhost:15672登陆,因此需要去官方下载一个配置文件模板(rabbitmq.conf),然后放到 /etc/rabbitmq/目录下)
取消图中配置的注释,使得guest用户可以远程登录。修改配置文件后,重启服务(service rabbitmq-server restart),然后就可以使用guset登陆进网页管理界面。

1、简单模型下:
autoack设置为true,即表示为只要消费进行消费,则表示消费成功,无论消费块内部是否出现异常,设为false标示在未手动进行设置autoack标示时,队列消息状态为未消费。

 2.Work queues:消息队列模型(能者多劳模型,多个消费者时,默认按照平均分配的原则分配消费消息,可设置为消费快的多消费模式)

 图中标示位置,表示打开处理的块的消费者多消费消息数据的模式。

 

 3.publish/subscrible:发布订阅模型

生产者将消息发送到交换机,而不是直接发送到队列,交换机将消息发送到队列,实现一个消息被多个消费者消费的目的。

交换机(exchanges)一方面接收生产者发送的消息,另一方面知道如何处理消息,例如递交给某个特定的队列,递交给所有队列,或是将消息丢弃。

具体如何操作取决于Exchange的类型:

 交换机只负责转发消息,不具备存储消息的能力。因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息将会消失。

 上图中图1中是生产者将消息以广播的形式发送到交换机(图2是发送到队列)

 

上图为消费者中绑定交换器和队列

 

4、交换机路由模式:不同的消息被不同的队列所消费的场景

生产者向交换机发送消息时,会指定一个routing key。

交换机接受生产者的消息后,把消息递交给与routing key完全匹配的消息队列

消费者所在队列指定了需要的routing key时,则消费该消息,否则不能消费。

上图生产者绑定routing_key

上图消费者绑定routing_key

 

 5.topic模型:和routing_key模式基本相同,不过在绑定routing_key的时候可以使用通配符。

 

 上图为topic模式下生产者

 上图为topic模式下的消费者

 

持久化:防止消息丢失(例如重启rabbitmq服务后,未持久化的交换机和队列会销毁)

 上图为生产者开启持久化

 上图为消费者开启持久化

 

SpringBoot整合rabbitMQ:

1、添加pom依赖

 

 2、yaml配置rabbitMQ配置

 

 3、定义队列

 

 4、定义消费者

 

 5、编写测试类(在SpringBoot提供的测试类里面编写)

posted @ 2020-04-23 22:27  caoyp  阅读(1476)  评论(0编辑  收藏  举报