RabbitMQ
RabbitMQ是一个开源的消息中间件,可以通过普通协议在不同的应用之间传递数据(跨语言),通过Erlang语言编写,基于AMQP协议。
AMQP协议
AMQP全称:Advanced Message Queuing Protocol 高级消息队列协议,应用层协议。
早期的消息中间件没有统一的标准,各自有自己的一套体系,各自的API,各自的协议。相互不能通信,Java方面针对此问题提出了JMS规范协议,提供了统一的Java接口,此时Java应用程序只需要选择合适的驱动即可,JMS会处理好其它部分。但仅仅在Java层面使用,AMQP,更好的消息通信解决方案,更上层次的封装,从一开始就称为标准可以实现跨语言通信。
AMQP核心概念
Server:又称Broker,接收客户端的连接,实现AMQP实体服务。
Connection:连接,应用程序连接RabbitMQ服务器时所用的连接,TCP长连接。
Channel:信道,通过Conection建立的TCP连接内的虚拟连接,AMQP命令通过信道传到服务器。加强版的传输层,一条TCP连接,多个独立的信道并行。
生产者:消息的创建者,将消息发送到RabbitMQ
消费者:消费消息的一方
**消息:**包含有效载荷和标签,有效载荷指要传输的数据,可以是任何内容 如json数组,标签描述了有效载荷,并且rabbitmq用它来决定谁获得消息,消费者只能拿到有效载荷,并不知道生产者是谁。
交换器、队列、绑定、路由键:队列通过路由键(Rounting key)绑定到交换器,生产者发布消息到交换器,交换器根据自身规则进行转发至对应的消息队列,然后订阅这个队列的消费者进行消费。
一个交换器可以绑定多个队列,一个队列也可以绑定多个交换器。
交换器的种类
服务器会根据路由键将消息从交换器路由到队列,但它是如何处理投递到多个队列的情况呢?协议中一共定义了四种类型的交换器:
- direct:路由键完全匹配,消息被投递到对应的队列,每个服务器的实现都必须有一个direct交换器,包含一个空白字符串名称的默认交换器
- fanout:交换器会将消息广播到所有绑定在该交换器的队列中。
- topic:通过通配符可以使得来自不同源头的消息进入同一个队列,通配符有两个,*代表匹配一个单词。#代表匹配零个或者多个单词。单词与单词之间用 . 隔开。在BingdingKey中使用通配符,然后RountingKey就可以根据通配符进行通配。
- headers:headers类型的交换器不依赖于路由键的匹配规则来路由消息,而是根据发送消息内容中的headers属性进行匹配。headers类型的交换器性能差,不实用,基本上不会使用。
虚拟主机
虚拟消息服务器,vhost,本质上就是一个mini版的mq服务器,有自己的队列、交换器和绑定,最重要的,自己的权限机制。Vhost提供了逻辑上的分离,可以将众多客户端进行区分,又可以避免队列和交换器的命名冲突。Vhost必须在连接时指定,rabbitmq包含缺省vhost:“/”,通过缺省用户和口令guest进行访问。
rabbitmq里创建用户,必须要被指派给至少一个,并且只能访问被指派内的队列、交换器和绑定。必须通过的管理控制工具创建。
不同的应用跑在不同的vhost中,实现业务隔离。