MQ称为Message Queue,消息队列是应用程序和应用程序之间的通信方法。
为什么使用MQ 在项目中,可以将一些无需即时返回且耗时的操作取出来,进行异步处理,而这种异步处理的方式节省了服务器的请求响应时间,从而提高了系统的吞吐量。
开发中消息队列通常有如下的应用场景:
任务异步处理将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理,提高应用程序的响应时间。
应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。削峰填谷 如订单系统,在下单的时候就会往数据库写数据,但是数据库只能支撑每秒1000左右的并发写入,并发量再高就容易宕机,低峰期的时候并发量也就100多个,但是在高峰期时候,并发量会突然激增到5000以上,这时候数据库肯定卡死了。消息被MQ保存起来,然后系统就可以按照自己的消费能力来消费,比如每秒1000个数据,这样慢慢写入数据库,就不会卡死数据库了。
但是使用MQ之后,限制消费消息的速度为1000,但是这样一来,高峰期产生的数据势必会被积压在MQ中,高峰就被“削”掉了。但是因为消息积压,在高峰期过后一段时间内,消费消息的速度还是维持在1000QPS,直到消费完积压的消息,这就叫“填谷”。
实现MQ大概有两种方式:AMQP和JMS。
AMQP:是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。
JMS:JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
两者的区别:
JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定洗衣来统一数据交互的格式JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的JMS规定了两种消息模式;而AMQP的消息模式更加丰富。生产者发送消息:
生产者创建链接(Connection),开启一个信道(Channel),连接到RabbitMQ Broker声明队列并设置属性;如是否排它,是否持久化,是否自动删除;将路由键(空字符串)与队列绑定起来;发送消息至RabbitMQ Broker;关闭信道;关闭链接;消费者接收消息:
消费者创建连接(Connection),开启一个信道(Channel),连接到RabbitMQ Broker。向Broker请求消费相应队列中的消息,设置相应的回调函数;等待Broker回应响应队列中的消息,消费者接收消息;确认(ack,自动确认)接收到的消息;RabbitMQ从队列中删除相应已经被确认的消息;关闭信道;关闭连接;1.客户端与代理服务器Broker建立连接。会调用newConnection()方法,这个方法会进一步封装protocol Header 0-9-1的报文头发送给Broker,以此通知Broker本次交互采用的是AMQP0-9-1协议,
当我们在创建用户的时候,会指定用户访问一个虚拟机,并且该用户只能访问该虚拟机下的队列和交换机,如果没有指定,默认的是"/"。一个rabbitmq服务器可以运行多个vhost,以便于使用不同的业务需要,这样做即可以满足权限配置的要求,也可以避免不同业务之间队列、交换机的命名冲突问题,因为不同的host之间是隔离的。
"/"是rabbitmq默认的虚拟机,之前默认连接都是它。
后三个.*分别代表:配置权限、写权限、读权限