初始RabbitMQ
RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议子啊完全不同的应用之间共享数据,RabbitMQ是使用Erlang语言编写的,并且RabbitMQ是基于AMQP协议的
RabbitMQ 高性能的原因
Erlang语言
最初在交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的
Erlang语言的优点:Erlang有着和原声Socket一样的延迟
什么是AMQP高级消息队列协议
AMQP全称:(Advanced Message Queuing Protocol )高级 消息队列
AMQP定义:是到有现代特征的二进制协议·是一个提供统一消息应用层标准高级消息队列协议,是应用层协议的一个开放标 准,为面向消息的中间件架构.
AMQP的核心概念
- Server:又称Broker,接受客户端的连接,实现AMQP实体服务
- Connection: 连接,应用程序与Broker的网络连接
- Chanel:网络通信。几乎所有的操作都是在chanel中进行,Chanel是进行消息的读写通道,一个客户端可以建立多个Chanel,每个Chanel代表一个会话任务
- Message:消息,服务器和应用程序之间传递的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容
- Virtual host:虚拟主机,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干的Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange和Queue
- Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列
- Binding:Exchange和Queue之间的虚拟链接,binding中可以包含多个routing key
- Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息
- Queue:也称为Message Queue,消息队列,保存消息并将他们转发给消费者
RabbitMQ的整体架构
RabbitMQ消息是如何流转的(在Message当中会指定routing key)
命令行和管控台-基础操作
命令行和管控台-高级操作
本地管控台的启动
首先切换目录到 /etc/rabbitmq这个目录下 进行启动操作
service rabbitmq-server start
开启插件
sudo rabbitmq-plugins enable rabbitmq_management
一定要是以管理员权限
消息生产与消费
- ConnectionFactory:获取连接工厂
- Connection:一个连接
- Chanel:数据通信信道,可发送和接受消息
- Queue:具体的消息存储队列
- Producer & Consumer 生产者和消费者
Exchange交换机
Exchange:接收消息,并根据路由键转发消息所绑定的队列
RountingKey就是Exchange和Queue的绑定关系
交换机属性:
- Name:交换机名称
- Type:交换机类型:direct、topic、fanout、headers
- Durablity:是否需要持久化,true为持久化
- Auto delete:当最后一个绑定到Exchange上队列删除后,自动删除该Exchange
- Internal:当前Exchange是否用于RabbitMQ内部使用,默认为false在实际的使用当中基本上也设置为false)
- Arguments:扩展参数,用于扩展AMQP协议自制定化使用
Exchange类型详解
direct exchange
所有发送到Direct Exchange的消息被转发到RouteKey中指定的Queue
注意:Direct模式可以使用RabbitM自带的Exchange:default Exchange
,所以不需要将Exchange进行任何绑定(binding)操作,消息传递时,RouteKey必须完全匹配才会被队列吸收,
否则该消息会被抛弃
topic exchange
所有发送到topic Exchange的消息都被转发到所有关心routeKey中指定的Topic的queue上
Exchange将RouteKey和某topic进行模糊匹配,此时队列需要绑定一个topic
Fanout Exchange:
不处理任何的路由键,只需要简单的将队列绑定在交换机上,发送到交换机的消息都会被转发到与该交换机绑定的所有队列上
Fanout交换机转发消息是最快的
相对于direct类型来说的话,fanout不需要绑定routkey(设置RouteKey为空,设置了也没有作用)
简单点来说就是如果是同样的fanout和direct都绑定了queue,在fanout中所有的绑定了的queue都能收到消息
但是direct中的绑定的queue不一定能接收到消息,必须要RouteKey一致
但是不绑定就一定收不到消息
Header Exchange:
通过消息头来判断(不常用)
Binging-绑定
Exchange和Exchange、Queue之间的连接关系
Binding中可以包含RoutingKey或者参数
Queue-消息队列
消息队列,实际存储消息
Durablity:是否持久化,Durable:是,Transient:否
Auto delete:如果选择yes,代表当最后一个监听被移除之后,该Queue会自动被删除
Message-消息
服务器和应用程序之间传送的数据
本质上就是一段数据,由properties和payload(body)组成
常用属性:delivery mode(持久化和非持久化),header(自定义属性)
其他属性:content_type,content_encoding,priorty
correlation_id(关键, 一般是用来作为消息的唯一ID,由业务和timestampID组成 ),reply_to,expiration,message_id,
timestamp,type,user_id,app_id,cluster_id
Vitual Host-虚拟主机
虚拟地址,用于进行逻辑隔离,最上层的消息路由
一个Virtual Host里面可以有若干个Exchange和Queue
但是同一个Virtual Host里面能够有名称相同的Exchange和Queue