02消息队列系列-RabbitMQ的初步认识、安装、web管理端使用

02消息队列系列-RabbitMQ的初步认识、安装、web管理端使用

参考链接:
深入剖析 rabbitMQ

一、关于RabbitMQ

RabbitMQ 本质其实是用 Erlang 开发的 AMQP(Advanced Message Queuing Protocol )的具体实现,最初起源于金融系统,主要用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面有着不俗的表现。

2010年4月,RabbitMQ 科技公司被 VMware 旗下的 SpringSource 收购,在 2013 年 5 月被并入 Pivotal 。

其实 VMware,Pivotal 本质上是一家的。不同的是,VMware 是独立上市子公司,而 Pivotal 是整合了EMC的某些资源,现在并没有上市。其中我们现在使用的 Spring 系列框架,就是 Pivotal 公司热门的产品之一。

直到后来 Pivotal 将其开源,RabbitMQ 才逐渐走向大众!

二、RabbitMQ模型介绍

2.1 内部结构分析

RabbitMQ 本质是 AMQP 协议的一个开源实现,在详细介绍 RabbitMQ 之前,我们先来看一下 AMQP 的内部结构图!
image.png
基本概念如下:

  • Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序
  • Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
  • Binding:绑定,用于将消息队列和交换器之间建立关联。一个绑定就是基于路由将交换器和消息队列连接起来的路由规则,所以可以将它理解称一个由绑定构成的路由表。
  • Queue:消息队列,用来保存消息直到发送给消费者
  • Connection:网络连接,比如一个TCP连接
  • Virtual Host:虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是/
  • Broker:表示消息队列服务器实体
  • Message:消息实体,它由消息头和消息体组成。消息头主要由路由键、交换器、队列、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等属性组成,而消息体就是指具体的业务对象

相比传统JMS模型,AMQP主要多了Exchange、Binding这个新概念。


在 AMQP 模型中,消息的生产者不是直接将消息发送到Queue队列,而是将消息发送到Exchange交换器,其中还新加了一个中间层Binding绑定,作用就是通过路由键Key将交换器和队列建立绑定关系。

image.png
就好比类似用户表角色表,中间通过用户角色表来将用户和角色建立关系,从而实现关系绑定,在 RabbitMQ 中,消息生产者不直接跟队列建立关系,而是将消息发送到交换器之后,由交换器通过已经建立好的绑定关系,将消息发送到对应的队列!

RabbitMQ 最终的架构模型,核心部分就变成如下图所示:
image.png
从图中很容易看出,与 JMS 模型最明显的差别就是消息的生产者不直接将消息发送给队列,而是由Binding绑定决定交换器的消息应该发送到哪个队列,进一步实现了在消息的推送方面,更加灵活!

2.2 交换器分发策略

当消息的生产者将消息发送到交换器之后,是不会存储消息的,而是通过中间层绑定关系将消息分发到不同的队列上,其中交换器的分发策略分为四种:Direct、Topic、Headers、Fanout!

  • Direct:直连类型,即在绑定时设定一个 routing_key,消息的 routing_key 匹配时,才会被交换器投送到绑定的队列中去,原则是先匹配、后投送
  • Topic:按照规则转发类型,支持通配符匹配,和Direct功能一样,但是在匹配 routing_key的时候,更加灵活,支持通配符匹配,原则也是先匹配、后投送
  • Headers:头部信息匹配转发类型,根据消息头部中的 header attribute参数类型,将消息转发到对应的队列,原则也是先匹配、后投送
  • Fanout:广播类型,将消息转发到所有与该交换机绑定的队列上,不关心 routing_key

2.2.1 Direct

Direct 是 RabbitMQ 默认的交换机模式,也是最简单的模式,消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。

如果传入的 routing key 为 black,不会转发到black.green。Direct 类型交换器是完全匹配、单播的模式
image.png

2.2.2 Topic

Topic 类型交换器转发消息和 Direct 一样,不同的是:它支持通配符转发,相比 Direct 类型更加灵活!

两种通配符:*只能匹配一个单词,#可以匹配零个或多个。

如果传入的 routing key 为 black#,不仅会转发到black,也会转发到black.green

image.png

2.2.3 Headers

headers 也是根据规则匹配, 相比 direct 和 topic 固定地使用 routing_key , headers 则是通过一个自定义匹配规则的消息头部类进行匹配。

在队列与交换器绑定时,会设定一组键值对规则,消息中也包括一组键值对( headers 属性),当这些键值对有一对, 或全部匹配时,消息被投送到对应队列。

此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了。
image.png

2.2.4 Fanout

Fanout  类型交换器与上面几个不同,不管路由键或者是路由模式,会把消息发给绑定给它的全部队列,如果配置了 routing_key 会被忽略,也被成为消息广播模式。很像子网广播,每台子网内的主机都获得了一份复制的消息。

fanout 类型转发消息在四种类型中是最快的。
image.png

三、RabbitMQ安装

RabbitMQ 基于 erlang 进行通信,相比其它的软件,安装有些麻烦,为了跟生产环境保持一直,操作系统选择CentOS7,不过本例采用rpm方式安装,任何新手都可以完成安装,过程如下!

3.1 安装前命令准备

输入如下命令,完成安装前的环境准备。

yum install lsof  build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz wget vim

3.2 下载RabbitMQ、erlang、socat的安装包

本次下载的是RabbitMQ-3.6.5版本,采用rpm一键安装,适合新手直接上手。
先创建一个rabbitmq目录,本例的目录路径为/usr/app/rabbitmq,然后在目录下执行如下命令,下载安装包!

  • 下载erlang
wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
  • 下载socat
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
  • 下载RabbitMQ
wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm


最终目录文件如下:
image.png

3.3 安装安装包

下载完之后,按顺序依次安装软件包,这个很重要哦~

  • 安装erlang
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
  • 安装socat
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
  • 安装rabbitmq
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

安装完成之后,修改rabbitmq的配置,默认配置文件在/usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin目录下。

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app

修改loopback_users节点的值!
image.png
最后只需通过如下命令,启动服务即可!

rabbitmq-server start &

运行脚本之后,如果报错,例如下图!
image.png
解决办法如下:

vim /etc/rabbitmq/rabbitmq-env.conf

在文件里添加一行,如下配置!

NODENAME=rabbit@localhost

然后,再保存!再次以下命令启动服务!

rabbitmq-server start &

通过如下命令,查询服务是否启动成功!

lsof -i:5672

如果出现5672已经被监听,说明已经启动成功!
image.png

3.4 启动可视化的管控台

输入如下命令,启动控制台!

rabbitmq-plugins enable rabbitmq_management

用浏览器打开http://ip:15672,这里的ip就是 CentOS 系统的 ip,结果如下:
image.png
账号、密码,默认为guest,如果出现无法访问,检测防火墙是否开启,如果开启将其关闭即可!
登录之后的监控平台,界面如下:
image.png

3.5 Docker引擎下安装启动RabbitMQ

3.5.1 进入docker hub镜像仓库地址

https://hub.docker.com/

3.5.2 搜索RabbitMQ

进入官方的镜像,可以看到以下几种类型的镜像;我们选择带有“mangement”的版本(包含web管理页面
image.png
image.png

3.5.3 拉取镜像

docker pull rabbitmq:3.7.7-management

使用:docker images 查看所有镜像
image.png

3.5.4 根据下载的镜像创建和启动容器

docker run -d  -p 5672:5672 -p 15672:15672

-d 后台运行容器
-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号)

3.5.5 使用浏览器打开web管理端:http://Server-IP:15672

image.png

四、web界面使用

进入 web 管理界面之后,可以很清晰的看到分了 6 个菜单目录,分别是:Overview、Connections、Channels、Exchanges、Queues、Admin

4.1 Overview

4.1.1 Overview-> Totals

image.png

4.1.1.1 Queued message 所有队列的阻塞情况

  • Ready:待消费的消息总数
  • Unacked:待应答的消息总数
  • Total:总数 Ready+Unacked

4.1.1.2 Message rates 所有队列的消费情况

速率=(num1-num0)/(s1-s0)
num1:s1时刻的个数
num0:s0时刻的个数

  • Disk read:queue从磁盘读取消息的速率。
  • Disk write:queue从磁盘写入消息的速率。

4.1.1.3 整体角色的个数

  • Connections:client的tcp连接的总数。
  • Channels:通道的总数。
  • Exchange:交换器的总数。
  • Queues:队列的总数。
  • Consumers:消费者的总数。

4.1.2 Overview-> Nodes

image.png
启动一个broker都会产生一个node。

4.1.2.1 broker的属性

  • Name:broker名称
  • File descriptors:broker打开的文件描述符和限制。
  • Socket descriptors:broker管理的网络套接字数量和限制。当限制被耗尽时,RabbitMQ将停止接受新的网络连接。
  • Erlang processes:erlang启动的进程数。
  • Memory:当前broker占用的内存。
  • Disk space:当前broker占用的硬盘。
  • Uptime:当前broker持续运行的时长。
  • Info:未知。
  • Reset stats:未知。

4.1.3 Overview-> Ports and contexts

image.png

4.1.4 Overview-> Export definitions

定义由用户,虚拟主机,权限,参数,交换,队列和绑定组成。 它们不包括队列的内容或集群名称。 独占队列不会被导出。

4.1.5 Overview-> Inport definitions

导入的定义将与当前定义合并。 如果在导入过程中发生错误,则所做的任何更改都不会回滚。

4.2 Connections

当前所有客户端活动的连接。包括生成者和消费者。
image.png

  • Name:名称。
  • User name:使用的用户名。
  • State:当前的状态,running:运行中;idle:空闲。
  • SSL/TLS:是否使用ssl进行连接。
  • Protocol:使用的协议。
  • Channels:创建的channel的总数。
  • From client:每秒发出的数据包。
  • To client:每秒收到的数据包。

4.3 Channels

当前连接所有创建的通道。
image.png

  • channel:名称。
  • User name:使用的用户名。
  • Mode:渠道保证模式。 可以是以下之一,或者不是:C: confirm。T:transactional(事务)。
  • State :当前的状态,running:运行中;idle:空闲。
  • Unconfirmed:待confirm的消息总数。
  • Prefetch:设置的prefetch的个数。
  • Unacker:待ack的消息总数。
  • publish:producter pub消息的速率。
  • confirm:producter confirm消息的速率。
  • deliver/get:consumer 获取消息的速率。
  • ack:consumer ack消息的速率。

点击具体某个具体的信道,可以看到对应的消费队列等信息。
image.png

4.4 Exchanges

image.png
Name:名称。
Type:exchange type
Features:功能。 可以是以下之一,或者不是:D: 持久化。I:Internal,存在该功能表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定,否则可以推送消息也可以绑定。
Message rate in:消息进入的速率。
Message rate out:消息出去的速率。

4.4.1 Exchanges-> Add a new exchange

新增一个交换器
image.png

  • Name:交换器名称
  • Type:交换器类型
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自动删除,当最后一个绑定(队列或者exchange)被unbind之后,该exchange 自动被删除
  • Internal:是否是内部专用exchange,是的话,就意味着我们不能往该exchange里面发消息
  • Arguments:参数,是AMQP协议留给AMQP实现做扩展使用的


我们先新建一个名称为hello-exchange,类型为direct的交换器,结果如下。
image.png
等会用于跟队列关联!

4.5 Queues

队列管理
image.png

  • Name:名称。
  • Type:队列类型
  • Features:功能。 可以是以下之一,或者不是:D: 持久化。
  • State:当前的状态,running:运行中;idle:空闲。
  • Ready:待消费的消息总数。
  • Unacked:待应答的消息总数。
  • Total:总数 Ready+Unacked。
  • incoming:消息进入的速率。
  • deliver/get:消息获取的速率。
  • ack:消息应答的速率。

4.5.1 Queues-> Add a new queue

image.png

  • Type:队列类型
  • Name:队列名称
  • Durability:是否持久化,Durable:持久化,Transient:不持久化
  • Auto delete:是否自动删除,是的话,当队列内容为空时,会自动删除队列
  • Arguments:参数,是AMQP协议留给AMQP实现做扩展使用的

同样的,新建一个名称为hello-mq的消息队列,结果如下。
image.png
队列新建好了之后,继续来建立绑定关系!

4.5.1.1 绑定队列

建立绑定关系,既可以从队列进入也可以从交换器进入。

  • 如果是从交换器进入,那么被关联的对象就是队列。

image.png

  • 如果是从队列进入,那么被关联的对象就是交换器。

image.png
我们选择从队列入手,被绑定的交换器是hello-exchange,因为类型是direct,所以还需要填写routing key
image.png
建立完成之后,在交换器那边也可以看到对应的绑定关系。
image.png

4.5.1.2 发送消息

最后,我们从交换器入手,选择对应的交换器,点击Publish message标签,填写对应的路由键 key,发送一下数据,查看数据是否发送到对应的队列中。
image.png
然后点击进入 Queues 菜单,查询消息队列基本情况。
image.png
然后选择hello-mq消息队列,点击Get messages标签,获取队列中的消息。
image.png
结果如下,可以很清晰的看到,消息写入到队列!
image.png

4.6 Admin

系统管理,主要介绍用户、虚拟主机、权限等信息
image.png

  • Name:名称。
  • Tags:角色标签,只能选取一个。
    • administrator (超级管理员)
      • 可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
    • monitoring(监控者)
      • 可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
    • policymaker(策略制定者)
      • 可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。
    • management(普通管理者)
      • 仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
    • none(其他)
      • 无法登陆管理控制台,通常就是普通的生产者和消费者。
  • Can access virtual hosts:允许进入的vhost。
  • Has password:设置了密码。

到此结束

posted @ 2020-10-07 19:58  在线打工者  阅读(1042)  评论(0编辑  收藏  举报