1.什么是RabbitMQ
1.0.什么是MQ
1.1.RabbitMQ简介
消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,当然前提是这些服务订阅了该队列。如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度。
RabbitMQ是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。
RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。Erlang语言在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是RabbitMQ高性能的原因所在。可谓“人如其名”,RabbitMQ像兔子一样迅速。
1.2.AMQP高级消息队列协议
AMQP(Advanced Message Queuing Protocol)
提到RabbitMQ,就不得不提AMQP协议。AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
AMQP中消息的路由过程和JMS存在一些差别。AMQP中增加了Exchange和Binging的角色。生产者把消息发布到Exchange上,消息最终到达队列并被消费者接收,而Binding决定交换器的消息应该发送到哪个队列。
1.3.RabbitMQr 特点
RabbitMQ除了像兔子一样跑的很快以外,还有这些特点:
- 开源、性能优秀,稳定性保障
- 提供可靠性消息投递模式、返回模式
- 与Spring AMQP完美整合,API丰富
- 集群模式丰富,表达式配置,HA模式,镜像队列模型
- 保证数据不丢失的前提做到高可靠性、可用性
1.4.MQ典型应用场景
- 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
- 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
- 日志处理
- 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。
2.架构及基本概念
生产者 Producer:
产生数据发送消息的程序是生产者
消费者 Consumer :
消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。
消息 message :
不同的应用之间传递的共享数据
请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。
代理 Broker :
接收和分发消息的应用,RabbitMQ Server就是Message Broker
交换机 Exchange :
message 到达 broker 的第一站,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。
队列 Queue :
队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式
交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定。
根据分发规则,匹配查询表中的 routing key 与 binding Key 对照 ,分发消息到queue 中去。
路由键 Routing Key :
生产者将消息发送到交换机时会携带一个key,来指定路由规则
绑定键 Binding Key :
在绑定 交换机Exchange和队列Queue时,会指定一个BindingKey, 生产者发送消息携带的RoutingKey会和bindingKey对比,若一致就将消息分发至这个队列
绑定 Binding:
交换机Exchange 和 队列Queue 之间的虚拟连接,绑定Binding 中可以包含 绑定键 Routing key,绑定Binding 信息被保存到 交换机Exchange 中的查询表中,用于 消息Message 的分发依据
连接 Connection :
生产者Publisher / 消费者Consumer 和 代理broker之间的TCP连接
信道 Channel :
如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP, 连接Connection的开销将是巨大的,效率也较低。信道 Channel是在连接Connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个线程Thread创建单独的信道Channel进行通讯,
AMQP method包含了Channel id 帮助客户端和代理Message broker识别 信道Channel,所以信道Channel 之间是完全隔离的。
信道Channel作为轻量级的连接Connection极大减少了操作系统建TCP Connection的开销.
虚拟主机 vHost :
每一个RabbitMQ服务器可以开设多个虚拟主机每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的 “交换机exchange、绑定Binding、队列Queue”,更重要的是每一个vhost拥有独立的权限机制,这样就能安全地使用一个RabbitMQ服务器来服务多个应用程序,其中每个vhost服务一个应用程序。