RabbitMQ基础知识简介

目录

 

RabbitMQ特点

RabbitMQ结构

vhost虚拟主机

channel 消息通道

exchange消息交换机

交换机的类型

交换机的几个重要属性

Queue队列

RabbitMQ消息持久化


RabbitMQ特点

RabbitMQ是部署最广泛的消息代理,也是AMQP(Advanced Message Queuing Protocol,高级消息队列协议)的标准实现;它有一下特点:

  • 支持多种消息传递协议,消息队列,传递确认机制,灵活的路由消息到队列,多种交换类型
  • 可在许多操作系统及云环境中运行,并为大多数流行语言提供各种开发工具
  • 可插拔身份认证授权,支持TLS(Transport Layer Security, 安全传输层协议)和LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)。轻量且容易部署到内部、私有云或公有云中。
  • 也可以部署在分布式和联合配置中,以满足高规模、高可用性的要求
  • 有专门的用于管理和监督的http-API、命令行工具和UI

RabbitMQ结构

RabbitMQ基础知识简介

vhost虚拟主机

一个broker里可以开设多个虚拟主机;类似于许多流行web服务器使用的“虚拟主机”,并且提供AMQP实体所在的完全隔离的环境(用户组,exchange,queue等)。AMQP客户端指定在AMQP连接协商期间要使用的虚拟主机。

channel 消息通道

在客户端的每个连接里,可以建立多个channel, 每个channel代表一个会话任务。(定义exchange, 定义queue,绑定队列和exchange,publishMessage...都是在channel中完成的)

AMQP(使用TCP进行可靠传递)Connection(连接)通常是长期存在的,AMQP连接使用身份验证,可以用TLS、SSL进行保护。当应用程序不需要连接到AMQP代理的时,应关闭AMQP连接,而不是突然关闭底层TCP连接。

如果直接在TCP基础上进行数据流动,频繁的建立关闭TCP连接会消耗很多系统资源并使配置防火墙变得更加困难,而且TCP连接数量有限额。所以AMQP在TCP连接的基础上建立了channel(通道,特定通道和另一个通道上的通信完全分开,所以每个AMQP方法还带有一个通道号,客户端通过该通道号确定该方法针对的通道)。

exchange消息交换机

exchange是发送消息的AMQP实体。它接收消息(生产者-->交换机时产生RoutingKey)并将其按照自己的交换类型和某种规则(Binding;在绑定queue和Exchange的时候产生BindingKey;当RoutingKey与BindingKey相同时就会发送到相应队列中)路由到0个或多个队列。

交换机的类型

Direct exchange (Empty string) and amq.direct  (RoutingKey === BindingKey)
Fanout exchange amq.fanout (路由到所有绑到该exchange的queue)
Topic exchange amq.topic  (BindingKey与RoutingKey匹配)
Headers exchange amq.match (and amq.headers in RabbitMQ) (不依赖BindingKey和RoutingKey,根据Headers属性,headers中属性的值等于绑定时指定的值,则消息匹配)

交换机的几个重要属性

  • Name
  • Durability: 交换机可以是持久化的也可以是瞬时的。当broker重启时持久化的exchange仍旧存在,而瞬时的exchange则只能在broker上线后重新提交声明。
  • Auto-delete: 当没有一个队列绑定到该交换机时,则删除该交换机。
  • Arguments: (可选,根据插件和特定于代理的功能使用)

注:  default exchange是broker 预先声明的没有名字(空string)的直接交换机。它有一个特殊的属性,这对简单的应用程序非常有用: 创建的每个队列都使用和队列名相同的BindingKey来绑定到该exchange上。(所以default exchange看起来好像能直接把消息发给队列一样,即使技术上根本不是看起来的那样)

Queue队列

  • Name
  • Durable: 持久化(持久化到磁盘)后,当代理重启后该队列依旧存在。队列的持久性不会使路由到该队列的消息持久。如果代理被删除然后重新启动,则在代理启动期间将重新声明持久队列,但是,只会 恢复持久性消息。
  • Excusive : 仅由一个连接使用,当该连接关闭时就删除队列。
  • Auto-delete : 当没有消费者订阅时,删除队列。
  • Arguments : (可选,由插件和特定于代理的功能使用,例如消息TTL,队列长度限制等)

RabbitMQ消息持久化

RabbitMQ消息持久化,即数据写到磁盘上。需要exchange,queue,消息(投递时指定delivery_mode)都持久化。如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。