RabbitMq 【基本概念】

2019年5月7日 作者 jacky

定义


RabbitMq是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ是使用Erlang语言来编写的,并且RabbitMq是基于AMQP协议的

为什么大厂要选择RabbitMQ?

  1. 开源,性能优秀,稳定性保障
  2. 提供可靠性消息投递模式(comfirm)、返回模式(return)
  3. 与SpringAMQP完美的结合,API丰富
  4. 集群模式丰富,表达式配置,HA模式,镜像队列模型
  5. 保证数据不丢失的前提做到高可靠性,可用性

RabbitMq的高性能是如何做到的?

  1. Erlang语言最初在交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的
  2. Erlang的优点: Erlang有着和原生Socket一样的延迟

什么是AMQP高级协议?

AMQP(Advance Message Queuing Protocol)高级队列协议:
是具有现在特征的二进制协议,是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,其实就是一个规范

AMQP协议模型

AMQP的核心概念

  1. Server:又称Broker,接受客户端的连接,实现AMQP实体服务
  2. Connection:连接,应用程序与Broker的网络连接
  3. Channel:网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个回话任务。
  4. Message:消息,服务器和应用程序之间传送的数据,有Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息的实体,常用的属性:delivery mode、headers、content_type、content_encoding、priority。
  5. Virtual Host:虚拟地址,用于进行逻辑隔离,最上层的消息路由,一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host 里面不能有相同的名称的Exchange或Queue
  6. Exchange:交换机,接受消息,根据路由键转发消息到绑定的队列
  7. Binding:Exchange和Queue之间的虚拟连接,Binding中可以包含routing key
  8. Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定的消息
  9. Queue:也成为Message Queue,消息队列,保存消息

RabbitMq 整体架构模型是什么样子的?

架构如下图:

RabbitMq消息是如何流转的?

消息的流转图:

RabbitMq安装和使用

  • 服务的启动: rabbitmq-server start &
  • 应用停止:rabbitmqctl stop_app
  • 应用启动:rabbitmqctl start_app
  • 管理插件:rabbitmq-plugs enble rabbitmq_management

RabbitMq命令行和管控台

添加用户:rabbitmqctl add_user username password
列出所有用户: rabbitmqctl list_users
删除用户:rabbitmqctl delete_user username
清除用户权限:rabbitmqctl clear_permissions -p vhostpath username
列出用户权限:rabbitmqctl list_user_permissions username
修改密码:rabbitmqctl change_password username newpassword
设置用户权限:rabbitmqctl set_permissions -p vhostpath username

创建虚拟主机:rabbitmqctl add_vhost vhostpath
列出所有的虚拟主机:rabbitmqctl list_vhosts
列出虚拟主机上所有的权限:rabbitmqctl list_permissions -p vhostpath
删除虚拟主机: rabbitmqctl delete_vhost vhostpath

查看所有队列:rabbitmqctl list_queues
删除队列里的消息:rabbitmqctl -p vhostpath purge_queue blue

移除所有的数据(需要在rabbitmqctl stop_app 后使用):rabbitmqctl reset
组成集群命令: rabbitmqctl join_cluster [–ram]
修改集群节点的存储形式: rabbitmqctl change_cluster_node_type disc | ram
忘记节点(移除节点): rabbitmqctl forget_cluster_node [–offline]
修改节点名称: rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2…]

RabbitMq消息的生产和消费

这里介绍的是Springboot的版本
TODO

RabbitMq交换机详解

Exchange:接受消息,并根据路由键转发消息所绑定的队列

交换机属性:

Name:交换机名称
Type:交换机类型 direct、topic、fanout、headers
Durability:是否需要持久化,true为是
Auto Delete:当最后一个绑定到Exchange上的队列删除后,自动删除该Exchange,也就是说当Exchang上没有一个绑定对应的队列,自动删除
Internal:当前Exchange是否用于RabbitMq内部使用,默认是false
Arguments:扩展参数,用于扩展AMQP协议自制使用

交换机类型:

  • Direct Exchange:直连,所有发送到Direct Exchange的消息都被转发到Routekey中的指定的队列

  • Topic Exchange : 所有发送到Topic Exchange的消息被转发到所有关心RouteKey中指定Topic的Queue上,Exchange将RouteKey和某Topic进行模糊匹配(可以使用通配符进行模糊匹配),此时队列需要绑定一个Topic

  • Fanout Exchange : 不处理路由键,只需要简单的将队列绑定到路由机上,发送到交换机上的消息都会转发到于改交换机绑定的队列上,Fanout交换机也是转发消息最快的,因为不需要处理路由键