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提供的测试类里面编写)