产生的原因:
有的时候页面的数据跟DB中的数据不同,普通的解决方案会使代码低耦合,后台服务中嵌入了其他的服务,违背了微服务的独立原则
定义:
MQ全称为Message Queue,及消息对列."消息队列"是在消息的传输过程中保存消息的容器,他是典型的:生产者,消费者模型.生产者不断 向消息队列中生产消息,消费者不断的从队列中获取消息,因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的 侵入,这样就实现了生产者和消费者的解耦.
开发中消息队列重唱有如下应用场景:
1.任务异步处理:
高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。减少了应用程序的响应时间。
2.应用程序解耦合
MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
模式:
MQ是消息通信的模型,并发具体实现,主要有两种主流的方式:AMQP,JMS
区别与联系:
(1)JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
(2)JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
(3)MS规定了两种消息模型;而AMQP的消息模型更加丰富
*****RabbitMQ是基于AMQP协议,erlang语言开发,稳定性好*****
组成部分说明:
Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
生产者发送消息流程:
1.生产者和Broker建立TCP连接
2.生产者和Broker建立通道
3.生产者通过通道消息发送给Broker,由Exchange将消息进行转发
4.Exchange将消息转发到指定的queue(队列)
消费者接收消息流程:
1.消费者和Broker建立TCP连接
2.消费者和Broker建立通道
3.消费者监听指定的Queue(队列)
4.当有消息到达Queue是Broker默认将消息推送给消费者
5.消费者接收到消息
6.ack回复
消息确认机制(ACK)
如果消费者领取消息后,还没执行操作就挂掉了呢?或者抛出了异常?消息消费失败,但是RabbitMQ无从得知,这样消息就丢失了.
因此,RabbitMQ有一个ACK机制,当消费者获取消费后,会向RabbitMQ发送回执ACK,告知消息已经被接收,不过这种回执ACK分两种情况:
1.自动ACK:消息一旦被接收,消费者自动发送ACK
2.手动ACK:消息接受后,不会发送ACK,需要手动调用
详细讲述RabbitMQ以及AMQP协议: http://rabbitmq.mr-ping.com/AMQP/AMQP_0-9-1_Model_Explained.html
Windows本地安装:
1: 安装RabbitMQ需要先安装Erlang语言开发包。下载地址http://www.erlang.org/download.html
配置环境变量 ERLANG_HOME C:\Program Files (x86)\erl5.9
添加到PATH %ERLANG_HOME%\bin;
2:安装RabbitMQ 下载地址http://www.rabbitmq.com/download.html
配置环境变量 D:\rabbitMQ\rabbitmq_server-3.6.6
添加到PATH %RABBITMQ_SERVER%\sbin;
3:通过cmd 进入%RABBITMQ_SERVER%\sbin 目录以管理员身份运行 rabbitmq-plugins.bat
命令如下:rabbitmq-plugins.bat enable rabbitmq_management(安装本地服务器界面的插件)
4:安装完之后,在开始程序中会有文件:RabbitMQ Server
5:浏览器访问localhost(127.0.0.1):15672 默认账号:guest 密码:guest