1.什么是消息中间件?前端
消息(Message)是指在应用间传送的数据。这些数据能够为文本字符、JSON串、或者内嵌对象。安全
消息中间件(Message Queue Middleware,简称MQ)是指利用高效可靠的消息传递机制来进行平台间的通讯,经过数据通讯来达成分布式系统的集成。服务器
2.消息中间件的传递模型网络
2.1.点对点(P2P,Point-To-Point)模式多线程
2.2.发布/订阅(Pub/Sub)模式架构
2.消息中间件的做用并发
2.1.解耦:好比购买商品,下单完成后紧接着须要物流发货,若是这两个流程放在同一个系统会形成业务逻辑链特长,这时就会考虑将下单和物流发货设计成两个服务,服务间经过接口或者消息中间间来进行通讯,以下图所示。异步
2.2.冗余(存储):消息中间件具备消息持久化的能力,若是消费端速度赶不上生产者发送消息的速度,这时消息能够被持久化到中间件的服务上,等待消费者慢慢消费,生产者端不会阻塞,加大了系统吞吐量。分布式
另外若是消费者服务端宕机,因为消息中间件具备消息堆积能力,生产者端仍然能够将消息发送给中间件,不会受到任何影响,等消费者服务重启后,这时能够再从中间件获取消息消费。高并发
最后MQ为了保证消息的可靠性,防止消息丢失,消息中间件提供了消息确认机制,只有消费端明确给MQ发送消息成功消费的讯号后,MQ才会删除该消息。在未接收到消费讯号前,会一直存储在MQ上。
2.3.流量削峰:最多见的是在秒杀场景中,用户购买商品完整的流程可能包含:下单、扣库存、发短信、发红包、物流配送,若是整个流程在一个事务或者说线程中执行完,那执行时间是很长的,再加上在秒杀高并发的场景下,服务器压力大,这个时间可能更长。如何优化?消息中间件,以下图所示:
加入消息中间件后,下单完成后,该事务内只须要在发送四条消息分别给库存服务,短信服务,红包服务,物流服务,而后就能够给客户端响应了,这样减短了整个事务链的长度,增长了系统吞吐量。
2.4.可恢复性:当平台一部分服务失效时,不会影响到整个系统。消息中间件下降了进程间的耦合度,因此即便一个处理消息的进程挂掉,加入消息中间件中的消息仍然能够在系统恢复后进行处理。
2.5.缓冲:因为MQ有消息堆积能力,在生产端和消费端之间的MQ服务就能够做为缓冲层来下降消费端的压力,好比在秒杀场景中,给前端服务加入MQ后,高并发的请求过来后只须要将请求转化为消息投递到MQ后,就能够响应信息了,而消费者这边能够按照自己服务器的负载能力去消息队列中获取消息消费。
2.6.异步通讯:在不少时候应用不想也不须要当即处理消息,消息中间件提供了异步处理机制,容许应用把消息投递到中间件中,而后消费端在须要的时候慢慢处理。
3.RabbitMQ简介
RabbitMQ是采用Erlang语言实现AMQP(Advance Message Queuing Protocol,高级消息队列协议)协议的消息中间件,它最初起源于金融系统,用于在分布式系统中转发消息。
4.RabbitMQ的特色
4.RabbitMQ相关概念
RbbitMQ总体上市一个生产者和消费者模型,主要负责接收消息、存储消息、转发消息。
RabbitMQ的总体模型架构如图所示:
Message:消息,消息通常包含两个部分:消息体(Payload)和标签(Label)。在实际应用中,消息体通常是一个带有业务逻辑结构的数据,好比Json字符串,固然也能够进一步对消息体进行序列化。消息的标签是用来表述这条消息的,好比一个交换器名称和一个路由键。
Producer:生产者,就是投递消息的一方。生产者建立消息,而后发布到RabbitMQ中。
Consumer:消费者,就是接收消息的一方。
Broker:消息中间件的服务节点。对于RabbitMQ来讲,一个RabbitMQ Broker能够看做一个RabbitMQ服务节点或者服务实例。大多数状况下也能够将一个RabbitMQ Broker看做一台RabbitMQ服务器。
Queue:队列,是RabbitMQ的内部对象,用于存储消息。RabbitMQ中的全部消息都只能存储在队列中,这一点跟Kafka这种消息中间件相反,Kafka将消息存储在topic(主题)这个逻辑层面,而相对应的队列逻辑只是topic实际存储文件中的位移标识。
RabbitMQ的生产者生产消息并经过交换机和路由键最终投递到队列中,消费者能够从队列中获取消息并消费。多个消费者能够订阅同一个队列,这时队列中的消息会被平均分摊(Round-Robin,即轮训)给多个消费者进行处理,而不是每一个消息都收到全部的消息。
RabbitMQ不支持队列层面的广播消费,若是须要广播消费,须要进行二次开发。
Exchange:交换器。它是用来接收生产者传递的消息,而后经过指定的路由键将消息路由到对应的一个或多个队列中,若是路由不到,或许会返回给生产者,或者直接丢弃。
RabbitMQ中的交换器有四种类型,不一样的类型有着不一样的路由策略。四种协议分别为:fanout、direct、topic、headers。AMQP协议里还提到另外两种类型:System和自定义,这里不予描述。
RoutingKey:路由键。生产者将消息发送给交换器的时候,通常会指定一个RoutingKey,用来指定这个消息的路由规则。
Binding:绑定。RabbitMQ中经过路由键将交换器与队列关联起来,而后将他们绑定在一块儿,Binding就是将他们绑定在一块儿的路由规则。
Connection:网络链接,好比一个TCP链接。客户端(生产者和消费者)和服务端(RabbitMQ Broker)建立网络链接Connection,基于Connection进行通讯。
Channel:信道,多路复用链接中的一个单独的双向通讯数据流通道。信道是创建在真实的TCP链接内地虚拟链接,AMQP 命令都是经过信道发出去的,不论是发布消息、订阅队列仍是接收消息,这些动做都是经过信道完成。由于对于操做系统来讲创建和销毁 TCP 都是很是昂贵的开销,因此引入了信道的概念,以复用一条 TCP 链接。
Connection能够用来建立多个Channel实例,可是Channel实例不能在线程间共享,应用程序应该为每一个线程开辟一个Channel。多线程共享Channel实例是非线程安全的。
Virtual Host:虚拟主机。每个RabbitMQ服务器都能建立虚拟的消息服务器,咱们称之为虚拟主机(Virtual Host),简称vhost。每个vhost本质上是一个独立小型RabbitMQ服务器,拥有本身独立的队列、交换器及绑定关系等,而且它拥有本身独立的权限。vhost就像是虚拟机与物理服务器同样,它们在各个实例减提供逻辑上的分离。,为不一样程序安全保密的运行数据,它既能将同一个RabbitMQ中的众多客户区分开,又能够避免队列和交换器等命名冲突。Vhost之间是绝对隔离的。若是在使用RabbitMQ达到必定规模的时候,建议用户对业务功能、场景进行归类区分,并为之分配独立的vhost。RabbitMQ默认建立的vhost为“/”。
5.AMQP协议介绍
RabbitMQ是AMQP协议的Erlang实现,固然RabbitMQ还支持STOMP、MQTT等协议,因此RabbitMQ的模型架构和AMQP协议是同样的。生产者(Producer)将消息(Message)发送给交换器(Exchange),交换器和队列(Queue)经过绑定建(BingingKey)绑定,当生产者发送消息时所携带的路由键(RoutingKey)和绑定键相匹配时,消息即被存入相应的队列之中,消费者能够订阅相应的队列来获取消息。
上面提到的RabbitMQ中的交换器、交换器类型、绑定、路由键等都是遵循AMQP协议中相应的概念。
AMQP协议自己包含三层。
AMQP协议是一个通信协议,是应用层的协议,AMQP是经过协议命令进行交互的。