RabbitMQ实战指南-(学习)RabbitMq管理(五)

  经过前面几篇博客的学习,到目前为止,我们己经熟练的使用客户端程序来发送和消费消息,但是距离掌控RabbitMQ还有一段距离,本章会从服务端的角度介绍RabbitMQ的一些工具应用,包括rabbitmqctl工具和rabbitmq_management插件,rabbitmqctl工具是一个系统工具,运用可以执行大部分RabbitMQ的管理操作,而rabbitmq_manage插件是rabbitMQ提供了一个管理插件,让用户可以通过图形化方式来管理RabbitMQ,但是他的功能却远远不仅如此。

多租户与权限

  每一个RabbitMQ服务器都创建虚拟的消息服务,我们称之为虚拟主机(virtual host),简称vhost,每一个vhost本质上是一个独立的小型RabbitMQ服务器,拥有自己独立的队列,交换器及绑定关系,并且它拥有自己独立的权限,vhost就像是一个虚拟机与物理服务器一样,它们在各个实例间提供了逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个RabbitMQ中的人多客户区分开,又可以避免队形和交换器等命名冲突,vhost之间是绝对隔离的,无法将vhost1中和交换器与vhost2中的队列进行绑定,这样既能保证了安全性,又可以确保可移植性,如果在使用RabbitMQ达到一定规模的时候,建议用户对业务功能,场景进行重新归类区分,并为之分配独立的vhost。
  vhost是AMQP概念的基础,客户端连接的时候必需定制一个vhost,RabbitMQ默认创建的vhost是“/”,如果不需要多个vhost或者对vhost的概念不是很理解,那么用这个默认的vhost也是非常合理,使用默认的用户名guest和密码guest就可以访问它。但是为了安全和方便,建议重新建立一个新的用户来访问它。
  可以使用rabbitmqctl add_vhost {vhost}命令创建一个新的vhost,大括号里的参数表示vhost的名称。
  示例如下:
  # rabbitmqctl add_vhost vhost1
  Creating vhost “vhost1”
  可以使用rabbitmqctl list_vhosts [vhostinfoitem …] 来罗列当前vhost的相关信息。目前vhostinfoitem的取值有2个。

  • name :表示vhost的名称
  • tracing : 表示是否使用RabbitMQ的trace功能,有关trace功能,可以参考如下:

示例如下:
  # rabbitmqctl list_vhosts name tracing
  Listing vhosts
  vhost1 false
  / false
  # rabbitmqctl trace_on
  Starting tracing for vhost “/”
  Listing vhosts
  vhost1 false
  / true
  对应的删除vhost的命令是: rabbitmqctl delete_vhost {vhost},其中大括号里面的参数表示vhost的名称,删除掉一个vhost同时也会删除其他所有的队列,交换器,绑定关系,用户权限,参数和策略等信息。
  # rabbitmqctl delete_vhost vhost1
   Deleting vhost "vhost1 "
  # rabbitmqctl list_vhosts name tracing
  Listing vhosts
  vhost1 false
  / true
  AMQP协义中并没有指定权限在vhos级别还是服务器级别实现,由于具体的应用自定义,在RabbitMQ中,权限控制则以vhost为单位,当创建一个用户时,用户通常会被指派给至少一个vhost内的队列,交换器和绑定关系,因此,RabbitMQ中的授予权限是指vhost级别对用户而言的权限授予。
  相关的授予权限命令为:rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}。其中各个参数的含义如下所示:

  • vhost:授予用户访问的权限的vhost名称,可以设置为默认值,即vhost为 “/”
  • user : 可以访问指定vhost的用户名
  • conf : 一个用于匹配的用户在哪些资源上拥有可写权限的正则表达式。
  • write : 一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。
  • read : 一个用于匹配用户在哪些资源上拥有可读权限的正则表达式。

   注: 可配置指是队列和交换器的创建及删除之类的操作,可写指的是发布消息,可读指与消息相关的操作,包括读取消息及清空整个队列等。
下面展示了不同AMQP命令的列表和对应的权限 :

AMQP命令可配置可写可读
Exchange.Declareexchange
Exchange.Declare(with AE)exchangeexchange(AE)exchange
Exchange.Deleteexchange
Queue.Declarequeue
Queue.Declare(with DLX)queueexchange(DLX)queue
Queue.Deletequeue
Exchange.Bindexchange(destination)exchange(source)
Exchange.Unbindexchange(destination)exchange(source)
Queue.Bindqueueexchange
Queue.UnBindqueueexchange
Basic.Publishexchange
Basic.Getqueue
Basic.Consumequeue
Queue.Purgequeue

  授予root用户访问虚拟主机vhost1,并在所有的资源上都具备了可配置,可写及可读权限,示例如下:
  # rabbitmqctl set_permissions -p vhost1 root “." ".” “.*”
  授予root用户可访问虚拟主机vhost2,在以"queue"开头的资源上具备可配置的权限,并在所有的资源上拥有可写,可读的权限,示例如下:

   # rabbitmqctl set_permissions -p vhost2 root "^queue." ". " “.*”
  Setting permissions for user “root” in vhost “vhost2”

  清除权限也是在vhost级别对用户而言,清除权限的命令为rabbitmqctl clear_permissions [-p vhost] {username},其中vhost用于设置禁止用户访问虚拟主机的名称,默认为 “/”,username 表示禁止访问特定的虚拟主机的用户名称。

   # rabbitmqctl clear_permissions -p vhost1 root
  Clearing permissions for user “root” in vhost “vhost1”
  在RabbitMQ中有两个Shell命令可以列举权限信息,第一个命令是rabbitmqctl list_permissions [-p vhost] ,用来显示虚拟主机上的权限,第二个命令是rabbitmqctl list_user permissions {username} ,用来显示用户的权限 。
  示例如下:
  # rabbitmqctl list_permissions -p vhost1
  Listing permissions in vhost “vhost1”
  root .* .* .*
  # rabbitmqctl list_user_permission root
  Listing permissions for user “root”
  / .* .* .*
  vhost1 .* .* .*
  细心的读者可能会注意到用到的所有命令都是rabbitmqctl工具的扩展命令,rabbitmqctl工具用来管理RabbitMQ中间件的命令行工具,它通过连接各个RabbitMQ节点来执行所有的操作,如果有节点没有运行,将显示诊断信息,不能到达或因不匹配的Erlang cookie而拒绝连接。
  rabbitmqctl 工具的标准语法如下([]表示可选参数,{}表示必选参数)
  rabbitmqctl [-n node] [-t timeout] [-q ] {command} [command options …]
  [-n node]
  默认节点是"rabbit@hostname" ,此处的hostname是主机名称,在一个名为"node.hidden.com"的主机上,RabbitMQ节点的名称通常是rabbit@node(除非RABBITMQ_NODENAME参数启动时被设置成了非默认值),hostname -s 命令的输出通常是“@”标志后的东西。
  [-q]
  使用-q标志来启用quiet模式,这样可以屏蔽一些消息的输出,默认不开启quiet模式。
  [-t timeout]
  操作超时时间(秒为单位),只适用于“list_xxx”类型的命令,默认是无穷大。
  下面来演示[-q]和[-t timeout] 参数的用法和效果。
  # rabbitmqctl list_vhosts
  Listing vhosts
  /
  # rabbitmqctl list_vhost -q
  /
  # rabbitmqctl list_vhosts -q -t 1
  /
  # rabbitmqctl list_vhosts -q -t 0
  Error: {timeout,0.0}

用户管理

  在RabbitMQ中,用户的访问控制(access Control)的基本单元,且单个用户可以跑起多个vhost进行授权,针对一至多个vhost,用户可以被赋予不同级别的访问权限,并使用标准的用户名和密码来认证用户。
  创建用户的命令为rabbitmqctl add_user {username} {password} 其中username表示要创建的用户名称,password 表示创建用户登录的密码。
  具体的创建一个用户名 为root ,密码为root123的用户:
  # rabbitmqctl add_user root root123
  Creating user “root”
  可以通过rabbitmqctl change_password {username} {newpassword}命令来更改指定用户的密码,其中username表示要变更的密码的用户名称,newpassword 表示要变更的新密码。
  举例,将root用户的密码变成root321
  # rabbitmqctl change_password root root321
  Changing password for user “root”
  同样可以清除密码,这样用户不能使用密码登录了,对应的操作命令为rabbitmqctl clear_password {username},其中username表示要清除的密码的用户名称。
  使用rabbitmqctl authenticate_user {username} {password}可以通过密码来验证用户,其中username表示格雷厄姆被验证的用户名称,password表示密码。
  # rabbitmqctl authenticate_user root root321
  Authenticating user “root”
  Success
  # rabbitmqctl authenticate_user root 322
  Authenticating user “root”
  Error:failed to authenticate user “root”
  删除用户的 命令是 rabbitmqctl delete_user {username},其中username表示要删除的用户名称。
  删除root用户的示例如下:
  # rabbitmqctl delete_user root
  Deleteing user “root”
  rabbitmqctl list_users 命令可以用来罗列当前所有的用户,每个结果行都包含用户名称,其后紧跟用户的角色(tags)
  # rabbitmqct list_users
  Listing users
  guest [administrator]
  root []
  用户的角色分别为5种类型

   用户的角色分别为5种类型

  • none :无任何角色,新创建的用户的角色默认为none;
  • managemement :可以访问WEb管理页面,Web管理页面在后面有详细介绍;
  • policymaker:包含了management的所有权限,并且可以管理我不知道怎么办(Policy)和参数(Parameter)。后面的博客再来说明了。
  • monitoring: 包含management的所有权限,并且可以看到所有按甲寝兵产,信道及节点相关的信息。
  • administartor:包含monitoring的所有权限,并且可以管理用户,虚拟主机,权限,策略,参数等,adminostator代表了最高的权限 。

  用户的角色可以通过rabbitmqctl set_user_tags {username} {tag …} 命令设置,其中username参数表示需要设置角色的用户名称,tag参数用于设置0个,1个或者多个角色,设置之后任何之前现有的身份都会被删除。

  示例如下:
  # rabbitmqctl set_user_tags root monitoring
  Setgint tags for user “root” to [monitoring]
  # rabbitmqctl list_users -q
  guest [administrator]
  root [monitoring]
  # rabbitmqctl set_user_tags root policymaker -q
  # rabbitmqctl list_users -q
  guest [administrator]
  root [policymaker]
  # rabbitmqctl set_user_tags root
  Setting tags for user “root” to []
  # rabbitmqctl list_users -q
  guest [administrator]
  root []
  # rabbitmqctl set_user_tags root policymaker,management
  # rabbitmqctl list_users -q
  guest [administrator]
  root [policymaker,management]

Web端管理

  前面讲述的都是使用rabbitmqctl工具来管理rabbitMQ,有些时候是否觉得这种方式是不是太不友好了呢?而且为了能够运行rabbitmqctl工具,当前的用户需要拥有访问Erlang cookie的权限,由于服务器可能是以guest或者root用户身份来运行,因此,你需要获得这些文件访问的权限,这样就引申出来一些权限管理的问题。
  RabbitMQ的开发团队也考虑到这种情况,并且开发了RabbitMQ management插件,RabbitMQ management插件同样是由Erlang语言编写的,并且和RabbitMQ服务运行在同一个Erlang虚拟机中。
  RabbitMQ Management插件可以提供Web管理界面来管理如前面所述的虚拟主机,用户等,也可以用来管理队列,交换器,绑定关系,策略,参数等,还可以用来监控RabbitMQ服务的状态及一些数据统计类信息,可谓是功能强大,基本上能够 涵盖所有的RabbitMQ管理的功能。
  在使用Web管理界面之前需要先启用RabbitMQ management插件,RabbitMQ提供了很多的插件,默认存入在$RABBITMQ_HOME/plugins目录下,如下所示:
在这里插入图片描述
  其中以.ez扩展名结尾的文件就是RabbitMQ的插件,上面文件中的rabbitmq_management-3.6.10.ez就是指RabbitMQ Management插件,启动插件的命令不是使用 rabbitmqctl工具,而是使用rabbitmq-plugins,其语法格式为。rabbitmq-pligins [-n node] {command} [command options …] ,启动插件是使用rabbitmq-plugins enable [plugin-name],关闭插件的命令是rabbitmq-plugins disable [plugin-name]。
  执行rabbitmq-plugins enable rabbitmq_management 命令来开启RabbitMQ management插件:
  # rabbitmq-plugins enable rabbitmq_management
  The following plugins have been enabled:
  amqp_client
  cowlib
  cowboy
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management
  Appliing plugin configuration to rabbit@node1 … started 6 plugins
  可以通过rabbitmq-plugins list命令来查看当前插件的使用情况,如下所示,其中标记为[E*]的显示启动。而[e.*]的隐式启动,如显示启动rabbitmq_management插件会同时隐式启动,amqp_client,cowboy,cowlib,rabbitmq_management_agent,
rabbitmq_web_dispatch等另外5个插件。
在这里插入图片描述
  开启rabbitmq_management插件之后还需要重启RabbitMQ用血才能使用其正式生效,之后就可以通过浏览器访问http://localhost:15672/ ,这样会出现一个认证登录的界面,可以通过默认的guest/guest的用户名和密码来登录,如果访问的IP地址不是本地地址,比如在192.168.0.2的主机访问http://192.168.0.3:15672的Web管理页面,使用默认的guest账户是访问不了的。在之前比较古老的版本中可以访问,但是出于安全性方面的考虑,在最近一些版本中不需要使用一个具有非none的用户角色的非none的用户角色的非guest账户来访问Web管理界面。
在这里插入图片描述

  在下图中我们可以看到用户guest被赋予了administrator的权限,在页面的下方可以添加用户,点击任意用户进入相关的详情页面,在页面中我们可以看到用户设置了权限和清除的权限,也可以删除或者更新用户,更新用户是指更新用户的密码和角色。

在这里插入图片描述
在这里插入图片描述

  之前提及的关于多个租户的概念及相应的管理操作,在此页面中可以添加相应的虚拟主机。

在这里插入图片描述
  点击列表中的虚拟主机也可以进入相应的虚拟主机的详细页面,在此详细页面中我们可以查看队列,消息的详细统计信息,也可以对用户的权限进行管理操作,还可以删除当前的虚拟主机。
  对于Web管理页面的其他功能,比如创建和删除队列,交换器,绑定关系,参数和策略等,操作会在后面再来介绍了。
  最后来补充一下与开启rabbitmq_management插件对应的关闭命令是rabbitmq-plugins disable rabbitmq_management,示例如下:
  # rabbitmq-plugins disble rabbitmq_management
  The follwing plugins haveee been disable
  amqp_client
  cowlib
  cowboy
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management
  Appliying plugin configuration to rabbit@node1 … stopped 6 plugins.

  某些情况下,登录Web管理界面会出现下图所示的情形,用户能够正确登录,但是除了页面的头部和尾部并没有其他的任何信息,此时清空下浏览器的缓存即可。

在这里插入图片描述

应用与集群管理
应用管理
rabbitmqctl top [pid_file]

  用于停止运行RabbitMQ的Erlang虚拟机和RabbitMQ服务应用,如果指定了pid_file,还需要等待指定的进程的结束,其中pid_file是通过调用rabbitmq-server命令启动RabbitMQ服务时创建的,默认情况下存放于Mnesia目录中,可以通过RABBITTTttMQ_PID_FILE这个环境变量来改变存放的路径的,注意,如果使用rabbitmq-server -detach这个带有-detach后缀的命令来启动RabbitMQ服务则不会生成pid_file文件。
  # rabbitmqctl stop
   /opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@node1.pid
  # rabbitmqctl stop
  Stopping and halting node rabbit@node1

rabbitmqctl shutdown

  用于停止运行RabbitMQ的Erlang虚拟机和RabbitMQ服务应用,执行这个命令会阻塞直到Erlang虚拟机进程退出,如果RabbitMQ没有成功关闭,则会返回一个非零值,这个命令和rabbitmqctl stop不同的是,它不需要指定pid_file而可以阻塞等待指定的进程关闭。
  示例如下:
  # rabbitmqctl shutdown
  Shutting down RabbitMQ node rabbit@node1 running at PID 1706
  Waiting for PID 1706 to terminate
  RabbitMQ node rabbit@node1 running at PID 1706 successfully sht down

rabbitmqctl stop_app

  停止RabbitMQ服务应用,但是Erlang虚拟机还是处于运行状态,此命令的执行优先于其他的管理操作(这些管理操作需要先停止RabbitMQ的应用),比如rabbitmqctl reset 。
  示例如下:
  # rabbitmqctl stop_app
  Stopping rabbitmq application on node rabbit@node1

rabbitmqctl start_app

  启动RabbitMQ应用,此命令典型的用途是在执行其他管理操作之后,重新启动之前停止的RabbitMQ应用,比如rabbitmqctl reset
  示例如下:
  # rabbitmqct start_app
  Starting node rabbit@node1

rabbitmqctl wait [pid_file]

  等待RabbitMQ应用的启动,它会等到pid_file的创建,然后等待pid_file中所有表示进程的启动,当指定进程没有启动RabbitMQ应用而关闭时将会返回失败。
  示例如下:
  # rabbitmqctl wait
  /opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@node1.pid
  Waiting for rabbit@node1
  # rabbitmqctl wait
  /opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@node1.pid
  pid is 3468
  Error: process_not_running

rabbitmqctl reset

  将RabbitMQ节点重置为最 初的状态,包括从原来所有的集群中删除此节点,从管理数据库中删除所有的配置数据,如己经配置的用户,vhost等,以及删除所有的持久化消息,执行rabbitmqctl rest 命令的前必需停止RabbitMQ应用(比如先执行rabbitmqctl stop_app)。
  示例如下:
  # rabbitmqctl stop_app
  Stopping rabbit application on node rabbit@node1
  # rabbitmqctl reset
  Resetting node rabbit@node

rabbitmqctl force_reset

  强制将RabbitMQ节点重置还原到最初的状态,不同于rabbitmqctl reset命令,rabbitmqctl force_reset命令无论是当前管理数据库状态和集群配置是什么,都会无条件的重置节点,它只能在数据库或者集群配置己经损坏的情况下使用,与rabbitmqctl reset命令一样,执行rabbitmqctl force_reset 命令前必需先停止RabbitMQ应用。
  # rabbitmqct stop_app
  Stopping rabbit application on node rabbbbit@node1
  # rabbitmqctl force_reset
  Forcefully resetting node rabbit@node1

rabbitmqctl rotate_logs {suffix}

  指定RabbitMQ节点轮换日志文件,RabbitMQ节点会将原来的日志文件中的内容追加到“原始名称+ 后缀”的日志文件中,然后再将新的日志内容记录到新创建的日志文件(与原日志文件同名),当目标不存在时,会重新创建,如果不指定后缀suffix,则日志文件只是重新打开,瑞不会进行轮换。
  示例如下,原日志文件为rabbit@node1.log 和rabbit@node1-sasl.lg,轮换日志之后,原日志文件中的内容不被追加到rabbit@node1.log.1 和rabbit@node1-sasl.log1 日志中,之后重新建立rabbit@node1.log 和rabbi@node1-sasl.log 文件来接收新的日志。

   # pwd
  /opt/rabbitmq/var/log/rabbitmq
  # ll
   rabbit@node1.log
  rabbit@node1-sasl.log
  # rabbitmqctl rotate_log.1
  Rotating logs to files with suffix “.1”
  rabbit@node1.log
  rabbit@node1.log.1
  rabbit@node1-sas1.log
  rabbit@node1-sas1.log.1

rabbitmqctl hipe_compile {directory}

  将部分RabbitMQ代码用HiPE(HiPE是指High Performance Erlang,是Erlang版JIT)编译,并且将编译后的.beam文件(beam文件是Erlang编译后生成的文件格式工,可以直接加载到Erlang虚拟机中运行的文件格式)保存到指定的文件目录中,如果这个目录不存在则会自行创建,如果这个目录原本有任何.beam文件,则会在执行编译前被删除,如果要使用预编译这些文件,则需要设置RABBITMQ_SERVER_CODE_PATH这个环境变量来指定hipe_compile调用路径。
  示例如下:
  # rabbitmqctl hipe_compile
  /opt/rabbitmq/tmp/rabbit-hipe/ebin
  HIPE compiling : |--------------------------------------------------------------------|
   #########################################
   Compiled 57 modules in 55s

集群管理

######rabbitmqctl join_cluster {cluster_node } [–ram]
  将节点加入指定集群中,在这个命令执行前需要停止RabbitMQ应用并重新设置节点

rabbitmqctl cluster_status

  显示集群的状态

rabbitmqctl change_cluster_node_type {disc | ram}

  修改集群节点的类型

rabbitmqctl forget_cluster_node [–offline]

  将节点从集群中删除。允许离线执行。

rabbitmqctl update_cluster_nodes {clusternode}

  集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息,这个和join_cluster不同,它不加入集群,考虑这样一种情况,节点A和节点B都在集群中,当节点A离线了,节点C又和节点B组成一个集群,然后节点B又离开了集群,当A醒来的时候,节点C又和节点B组成了一个集群,然后节点B又离开了集群,当A醒来的时候,它会尝试联系节点B,但是这样会失败,因为节点B己经不存在集群中了,Rabbitmqctl update_cluster_nodes -n A C可以解决这种场景下出现的问题。
示例如下:
  ## 假设己有node1 和node 组成的集群
  1.初始化状态
  # rabbitmqctl cluster_status
  Cluster status of node rabbit@node1
  [{nodes[{disc,[rabbit@node1,rabbit@node2]}]},
  {running_nodes,[rabbit@node2,rabbit@node1]},
  {cluster_name ,<<“rabbit@node1”>>},
  {partitions,[]},
  {alarms,[{rabbit@node2,[]},{rabbit@node1,[]}]}
  ]
  ## 2.关闭node1节点的应用
  # rabbitmqctl stop_app
  Stopping rabbit application on node rabbit@node1
  ##3.之后将node3加入到集群中(rabbitmqctl join_cluster rabbit@node2)
  ##4.再将node2节点的应用关闭
  ##5.最后启动node1节点的应用,此时会报错。
  # rabbitmqctl start_app
  Starting node rabbit@node1
  BOOT FAILED
  ===========
  Timeout contacting cluster nodes : [rabbit@node2].
  … (省略)
  ## 如果在启动node1节点的应用之前咨询node3并更新相应集群信息则可以解决这个问题
  # rabbitmqctl update_cluster_nodes rabbit@node3
  # rabbitmqctl start_app
  Starting node rabbit@node1
  ##.最终集群状态
  # rabbitmqctl cluster_status
  Cluster status of node rabbit@node1
  [{nodes,[{disc,[rabbit@node1,rabbit@node3]}]},
  {running_nodes},[rabbit@node3,rabbit@node1]
  {cluster_name,<<“rabbit@node1”>>}
  {partitions,[]},
  {alarms,[{rabbit@node3,[]},[rabbit@node1,[]]]}
  ]

rabbitmqctl force_boot

  确保节点可以启动,即使它不是最后一个关闭的节点,通常情况下,当关闭整个RabbitMQ集群时,重启的第一个节点应该是最后关闭的节点,因为它可以看到其他可以看到其他节点所看不到的东西,但是有时会有一些异常情况的出现,比如整个集群都被掉电而所有的节点都认为它不是最后一个关闭的,在这种情况下,可以调用rabbitmqctl force_boot命令,这就告诉节点可以无条件的启动节点,在此节点关闭后,集群的任何变化,它都会丢失,如果最后一个关闭的节点永久丢失了,那么就需要优先使用rabbitmqctl forget_cluster_node --offline命令,因为它可以确保镜像队列可以正常的运转。

  示例如下:
  # rabbitmqctl force_boot
  Forcing boot for Mnesia dir /opt/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@node2
  # rabbitmq-server -detached

rabbitmqctl sync_queue[-p vhost] {queue}

  批示未同步的队列queue的slave镜像可以同步master镜像行的内容,同步期间此队列会被阻塞(所有此队列的生产者和消费者都被被阻塞)。直到同步完成,此条命令执行成功的前提是队列的queue配置了镜像,注意,未同步队列的消息被耗尽后,最终也会变成同步,此命令主要用于未耗尽的队列。
示例如下:
  # rabbitmq sync_queue queue
  Synchronising queue ‘queue’ in vhost ‘/’

rabbitmqctl cancel_sync_queue [-p vhost] {queue}

  取消队列queue同步镜像的操作。

  示例如下:# rabbitmqctl cancel_sync_queue queue
  Stopping synchronising queue ‘queue’ in vhost ‘/’

rabbitmqctl set_cluster_name {name}

  设置集群名称,集群名称在客户端连接时会通报给客户端,Federation和Shovel插件也会有用到集群名称的地方,详细内容可以看后面,集群名称默认是集群中第一个节点的名称,通过这个命令可以重新设置,在Web管理界面的右上角,有个"(change)"的地方,点击也可以修改集群名称。
   # rabbitmqctl cluster_status
  Cluster status of node rabbit@node1
  [{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
  {running_nodes,[rabbit@node2,rabbit@node1]},
  {cluster_name,<<“rabbit@node1”>>},
  {partitions,[]},
  {alarms,[{rabbit@node2,[]}],{rabbit@node1,[]}}
  ]
  # rabbitmqctl set_cluster_name cluster_hidden
  [{nodes,[{disc,[rabbit@node1,rabbit@node2]}]},
  {running_nodes,[rabbit@node2,rabbit@node1]},
  {cluster_name,<<“cluster_hidden”>>},
  {partitions,[]},
  {alarms,[{rabbit@node2,[]}],{rabbit@node1,[]}}
  ]
  # rabbitmqctl cluster_status
  

服务端状态

  服务器状态查询会返回一个以制表符分隔的列表,list_queues,list_exchanges,list_bindings和list_consumers这种命令接收一个可先的vhost参数以显示其结果,默认值是 “/”

rabbitmqctl list_queues [-p vhost][queueinfoitem…]

  此命令返回队列的详细信息,如果无[-p vhost]参数,将显示默认的vhost 为 "/"中的队列详情,queueinfoitem参数用于指示哪些队列的信息项会包含在结果集中,结果集的列有顺序将匹配参数的顺序,queueinfoitem可以是下面列表中的任何值。

  • name :队列名称
  • durable : 队列是否持久化
  • auto_delete :队列是否自动删除
  • arguments :队列的参数
  • policy :应用到队列上的策略名称
  • pid: 队列关联的Erlang进程的Id
  • owner_pid:处理排他队列连接的Erlang进程ID,如果此队列是非排他的,此值将为空。
  • exclusive:队列是否是排他的。
  • exclusive_consumer_pid:订阅到些排他队列的消费者相关的信道关联的Erlang进程ID,如果此队列是非排他的,此值将为空。
  • message_ready :准备发送给客户端的消息个数
  • message_unacknowledged:发送给客户端但尚未应答的消息个数 。
  • messages :准备发送给客户端和未应答消息的总和
  • messages_ready_ram :驻留在内存中的message_ready的消息个数
  • messages_unacknowledged_ram: 驻留在内存中,message_unacknowledged 的消息个数
  • messages_ram :驻留在内存中消息总数
  • messages_persistent :队列中持久化消息的个数,对于非持久化队列来说是0
  • messages_bytes :队列中所有的消息大小总和,这里不包含消息属性或者任何其他开销。
  • messages_bytes_ready :准备发送给客户端的消息的大小总和。
  • messages_bytes_unacknowledged:发送给客户端但尚未应答的消息的大小总和
  • messages_bytes_ram : 驻留在内存中的messages_bytes。
  • messages_bytes_persistent : 队列中持久化的messages_bytes 。
  • disk_reads: 从队列启动开始,己从磁盘中读取该队列的消息总次数。
  • disk_writes:从队列启动开始,己经向磁盘队列写消息的总次数。
  • consumer:消费者的数目
  • consumer_utilisation :队列中的消息能够立刻投递给消费者的比率,介于0和1之间,这个受网络拥塞或者Basic.Qos的影响而小于1
  • memory:与队列相关的Erlang进程所消耗的内存字节数 ,包括栈,堆及内部结构 。
  • slave_pids :如果队列是镜像的,列出所有的slave镜像的pid
  • synchronised_slave_pids :如果队列是镜像的,列出所有的己经同步的slave镜像的pid .
  • state :队列的状态,正常情况下,running,如果队列正常同步可能会有"{syncing,MsgCount}"的状态,如果队列所有的节点掉线了,则队列显示状态为down(此时大多数的queueinfoitems也将不可用)

  #rabbitmqctl list_queues name durable auto_delete arguments -q
  queue1 true false []
  queue2 true false []
  queue3 true false []
  #rabbitmqctl list_queues name messages message_ram message_persistent
  queue1 0 0 0
  queue2 0 0 0
  queue3 1 1 0
  # rabbitmqctl list_queues -p vhost1 name disk_writes disk_reads -q
  queue4 3390 0
  queue5 0 0

rabbitmqctl list_exchanges [-p vhost ][exchangeinfoitem …]

  返回交换器的详细细节,如果无[-p Vhost]参数,将显示默认的vhost为“/”中的交换器详情,exchangenfoitem参数用于指示哪些信息项会包含的结果集中,结果集的列顺序将匹配参数的顺序,exchangeinfoitem可以是下面列表中的任何值。

  • name :交换器的名称
  • type :交换器的类型
  • durable:设置是否持久化,durable设置为true表示持久化,反之是非持久化,持久化可以将交换器信息存盘,而在服务器重启的时候不会丢失相关信息。
  • auto_delete :设置是否自动删除
  • internal:是否是内置的。
  • arguments:其他的一些结构化参数,比如alternate-exchange
  • policy :应用到交换器上的策略名称。

  exchangeinfoitem的内容和客户端中的channel.exchangeDeclare方法的参数基本上是一致的,如果没有指定exchangeinfoitem,那么此命令将显示交换器的名称和类型,相关示例如下。
  #rabbitmqctl list_exchanges name type durable auto_delete internal arguments policy -q
  amq.rabbitmq.trace topic true false true []
  amq.headers headers true false false []
  amq.match headers true false false []
  amq.topic topic true false false []
  amq.fanout fanout true false false []
  amq.rabbitmq.log topic true false false []
  amq.direct direct true false false []

rabbitmqctl list_bindings [-p vhost] [bindinginfoitem … ]

  返回绑定关系的细节 ,如果无[-p vhost]参数,将显示默认的vhost为“/”中绑定关系详情。bindinginfoitem参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数,bindinginfoitem可以是下面列表中的任何值。

  • source_name :绑定消息来源的名称
  • source_kind: 绑定消息来源的类别
  • destination_name :绑定中消息上的的名称
  • destination_kind:绑定中消息目的种类
  • routing_key :绑定路由键
  • arguments :绑定的参数

  如果没有指定bindinginfoitem,那么将显示所有的条目,相关示例如下
  # rabbitmqctl list_bindings -q
  exchange queue1 queue queue1 []
  exchange queue2 queue queue2 []
  exchange queue1 queue rk1 []
  其中交换器exchange1和队列queue1通过rk1进行绑定,还有一个独立的队列queue2,显示的第一行是默认的交换器与queue1进行绑定,这个是RabbitMQ内置的功能。

rabbitmqctl list_connections [connnectioninfoitem …]

  返回TCP/IP连接统计信息,connectioninfoitem参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序,connectioninfoitem可以是下面列表中的任何值。

  • pid :与连接相关的Erlang进行ID
  • name:连接的名称
  • port :服务器端口。
  • host :返回反射DNS获取的服务器主机名称,或者IP地址,或者未启用 。
  • peer_port :服务器对端口,当一个客户端与服务器连接时,这个客户端的端口就是peer_post 。
  • peer_host :返回反射DNS获取对端口主机名称,或者IP地址,或者未启用。
  • ssl :是否启用SSL。
  • ssl_protocal :SSL协义,如tlsv1。
  • ssl_key_exchange:SSL密钥交换算法。如rsa
  • ssl_cipher:SSL加密算法,如aes_256_cbc .
  • ssl_hash :SSL哈希算法,如sha
  • peer_cert_subject:对端SSL安全证书的主题,基于RFC4514的形式。
  • peer_cert_issuer :对端SSL安全证书的发行者,基于RFC4514的形式。
  • peer_cert_validity:对端SSL安全证书的有效期
  • state :连接状态,包括starting ,tuning,opening,running,flow,blocking ,blocked ,closing和closed的这几种。
  • channels:该连接中的信道个数
  • protocol :使用AMQP协义的版本,当前是{0,9,1}或者{0,8.0},注意,如果客户端请求的是AMQP 0-9的连接,RabbitMQ也会将其视为0-9-1
  • auth_mechanism:使用SASL认证机制,如PLAIN,AMQPLAIN,EXTERNAL,RABBT-CR-DEMO等。
  • user :与连接相关的用户名
  • vhost:与连接相关的vhost名称
  • timeout :连接超时,协商的心跳间隔,单位是秒
  • frame_max : 最大传输帧的大小,单位为B
  • channel_max:此连接上信道的最大数量,如果值是0 ,则表示无上限,但是客户端一般将0转变成65535
  • client_properties :在建立连接期间由客户端发送的信息属性。
  • revc_oct : 收到的字节数
  • recv_cnt :收到的数据包的个数
  • send_oct :发送的字节数
  • send_cnt:发送的数据包的个数
  • send_pend :发送的队列大小
  • connected_at :连接建立的时间戳。

  如果没有指定connectioninfoitem ,那么会显示 user,peer_host,peer_port ,和state这几项信息,相关示例如下:

  # rabbitmqctl list_connections user peer_host peer_port state -q
  root 172.16.158.00.22 57304 running

  # rabbitmqctl list_connections -q
  root 172.16.158.00.22 57304 running
  # rabbitmqct list_connections pid name host -q
  rabbit@node1.1.623.0 192.168.0.22:53704 -> 192.168.0.2:5672 192.168.0.2

rabbitmqctl list_consumers [-p vhost]

  列举消费者消息,每行将显示由制表符分隔的己经订阅的队列名称,相关的信道的进程标识,consumerTag,是否需要消费端确认,prefetch_count及参数列表这些信息。相关示例如下:
  # rabbitmqctl list_consumers -p default -q
  queue4 rabbit@node1.1.1628.11 consumer_zzh true 0 []

rabbitmqctl status

  显然Broker的状态,比如当前Erlang节点上运行的应用程序,RabbitMQ/Erlang的版本信息,OS的名称,内存及文件描述符等统计信息,具体示例如下:

rabbitmqctl node_health_check
  对RabbitMQ节点进行健康检查,确认应用是否正常运行,list_queues和list_channels是否能够正常返回等。相关示例如下:
  # rabbitmqctl node_health_check
  Timeout :70.0 seconds
  Checking health of node rabbit@node1
  Health check passed

rabbitmqctl environment

  显示每个运行我只能说环境中的每个变量的名称和值

rabbitmqctl report

  为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件中。相关示例如下:
  # rabbitmqctl report > report.txt

rabbitmqctl eval {expr}

  执行任意Erlang表达式,相关示例如下
  # rabbitmqctl eval ‘node()’
  rabbit@node1

eval 的扩展

  用户,Parameter,vhost,权限等都是通过rabbitmqctl工具来完成创建(或删除)的,操作反观交换器,队列及绑定关系的创建(或删除)操作并无相应的rabbitmqctl工具类的命令,到目前为止介绍的只有通过客户端或者Web管理界面完饭在,这对于CLI的使用爱好者来说中无缝是一种遗憾。
  这里就展示如何通过rabbitmqctl eval {expr} 以曲线救国的形式通过rabbitmqct 工具来创建交换器,队列及绑定关系,执行下面的三条命令就可以创建一个交换器exchange2,一个队列queue2并通过绑定键rk2进行绑定。
  rabbitmqctl eval ‘rabbit_exchange:declare ({resource,<<"/">>,exchange,<<“exchang2”>>},direct,true ,false,false,[]).’
  rabbitmqctl eval ‘rabbit_amqueue:declare({resource,<<"/">>,queue,<<“queue2”>>},true,false,[],none).’
  rabbitmqctl eval ‘rabbit_binding:add({binding,{resouce,<<"/">>,exchange,<<“exchange2”>>,<<“rk2”>>,{resouce,<<"/">>,queueee,<<“queue2”>>},[]}}).’
  其实这里就是调用Erlang中对应的模块相应的函数,语法类似“Module:Function(Arg).”’
  其实这里是调用了Erlang中对应的模块的相应函数,语法类似“Module:Function(Arg).”
  对于交换器的创建,则调用rabbit_exchange模块的declare函数,该函数具体的声明为:
  declare(Xname,Type,Durable,AutoDelete,Internal,Args )
  不同的RabbitMQ版本参数会略有差异,比如高版本的会多个UserName参数,采用上面的定义可以在多个当前主流版本中创建交换器,对应的参数下下所述

  • XName:交换器的命名细节,具体的格式{resouce,VHost,exchange,Name}。VHost为虚拟主机的名称,Name为交换器的名称,注意VHost和Name需要以"<<>>"包裹,标注为binary类型。
  • Type:交换器的类型,可以先值direct,headers,topic和fanout。
  • Durable:是否需要持久化。
  • AutoDelete:是否自动删除。
  • Internal:是否是内置的交换器。
  • Args:交换器的其他选项参数,一般设置为[]。

  与创建交换器对应的删除操作为调用rabbit_exchange模块的delete函数,示例如下:
  # rabbitmqctl eval ‘rabbit_exchange:delete({resouce,<<"/">>,exchange,<<“exchange2”>>},false).’
   ok
  对于队列的创建,则调用rabbit_amqqueue模块的declare函数,该函数具体声明为
  declare(QueueName,Durable,AutoDelete,Args,Owner).
  不同的RabbitMQ版本参数会略有差异,比如高版本会多一个ActingUser参数,采用上面定义的可在多个当前主流版本中创建交换器,对应的参数如下所述。

  • QueueName :队列的命令细节,具体格式为{resource,VHost,queue,Name}。
  • Durable:是否需要持久化。
  • AutoDelete:是否需要自动删除。
  • Args :队列的其他选项参数,一般设置为[]
  • Owner :用于队列的独占模式,一般设置为none

  #rabbitmqctl eval ‘rabbit_amqueue:interrnal_delete({resource,<<"/">>,queue,"<<“queue2”>>}).’
  ok
  对于绑定关系的创建,则调用rabbit_binding模块的add函数,该函数具体声明为 :
  add(Binding)
  不同的RabbitMQ版本参数会略有,比如高版本会多一个ActingUser参数,采用上面的定义可以在多个当前主流版本中创建交换器,对应的参数如下所述。

  • Binding :绑定关系,可以是exchange到exchange,也可以是exchange到queue,具体的格式如下{binding,Source,Key,Destination,Args}。Source表示消息源,必需为交换器,格式为{resource,VHost,exchange,Name},Key表示路由键,Destination为目的端,格式为{resource,VHost,exchange,XName}或者{resource,VHost,queue,QName},Args其他选项参数,一般设置为[]。
      # rabbitmqctl eval ‘rabbit_binding:remove({bindding,{resource,<<"/">>,exchange,<<“exchange2”>>},<<“rk2”>>,{resource,<<"/">>,queue,<<“queue2”>>},[]}).’
      小窍门:
      若要删除所有的癌,队列及绑定关系,删除对应的vhost就可以了, “一键搞定”,而不需要一个一个的遍历。
HTTP api 接口管理

  RabbitMQ Manage 插件不仅提供了Web管理界面,还提供了HTTP API接口来方便调用,比如创建一个队列,就可中通过PUT方法调用/api/queues/vhost/name接口来源。
  下面示例通过接口调用来完成queue的创建:
  # curl -i -u root:root123 -H “content-type:application/json -XPUT -d ‘{“auto_delete”:false,“durable”:true,“node”:“rabbit@node2”}’” http://localhost:15672/api/queue/%2F/queue 。
  HTTP/1.1 201 Created
  server : Cowboy
  date :Fri ,25 Aug 2017 06:03:17 GMT
  content-length : 0
  content-type : application/json
  vary : accept ,accpet-encoding ,orgin

  注意上面的命令中的"%2F"是指默认的vhost,即 “/” ,这类特殊的字符在HTTP URL中是需要转义,这里的curl命令又为创建(或删除)交换器,队列及绑定关系提供了另一种CLI的实现方式,所有的HTTP API接口都需要HTTP基础认证(使用标准的RabbitMQ用户数据库)默认的是guest/guest(非localhost的不能使用这组认证,除非特殊设置)
  这里的HTTP API是完全基于RESTful风格的,不同的HTTP API接口所对应的HTTP方法各不相同,这里一共汲及到4种http方法,GET ,PUT ,DELETE和POST,GET方法一般用来获取如集群 ,节点,队列,交换器等信息。PUT方法用来创建资源,如交换器,队列之类的,DELETE方法用来删除资源,POST方法也用来创建资源,与PUT不同的是,POST创建的是无法用来具体名称的资源,比如绑定关系(Bindings)和发布消息(publish)无法指定一个具体的名称。
  # curl -i -u root:root123 -XGET http://localhost:15672/api/queues/%2F/queue
  {“consumer_details”:[],“incoming”:[“deliveries”:[],“messages_details”:{“rate”,0.0},“messages”:0,“message_unacknowledged_details”:…省略]}
  对应的删除为:
  # curl -i -u root:root123 -XDELETE http://192.168.0.2:15672/api/%2F/queue
  下面展示了当前最新版本的HTTP API接口列表,以及对应的HTTP方法,每个版本的HTTP API 接口可能会有略有差异,点击Web管理界面。

GETPUTDELETEPOSTPath & Description
X/api/overview描述整个系统的各种信息
XX/api/cluster-name 集群的名称
X/api/nodes 集群中节点的信息
X/api/nodes/name 集群中单个节点的信息
XX/api/definitions GET方法列出集群中所有的元数据信息,包括交换器,队列,绑定关系,用户,vhost,权限及参数,POST方法用来加载新的元数数据信息,不过需要注意如下内容:(1)新的元数据信息佳驿以与原本合并,如果旧的元数据信息中某些项在新加载的元数据中没有定义,则不受任何影响(2)对于交换器,队列及绑定关系等不可变内容,如果新旧元数据有冲突,则会报错(3)对于其他的可变内容,如果新旧元数据有冲突,则会用新的替换掉旧的(4)
XX/api/definitions/vhost 将 /api/definitions 接口细化到vhost级别,其余的内容同上
X/api/connections 所有的连接信息
X/api/vhosts/vhost/connections 指定vhost中所有的连接信息
X所有的连接信息
X/api/vhosts/vhost/connections 指定vhost中所有的连接信息
XX/api/connections/name GET 方法列出指定的连接信息,DELETE方法可以close指定的连接
X/api/connections/name/channels 指定连接的所有信道信息
X/api/channels 所有信道信息
X/api/vhosts/vhost/channels 指定的Vhost中所有的信道信息
X/api/channels/channel指定的信道信息
X/api/consumers 所有的消费者信息
X/api/consumers/vhost 指定vhost中所有的消费者信息
X/api/exchanges 所有的交换器信息
X/api/exchanges/vhost 指定vhost中所有的交换器信息
XXX/api/exchanges/vhost/name GET 方法列出一个指定的交换器信息,PUT方法可以声明一个交换器,对应的内容可以参考如下 {“type”:“direct”,“auto_delete”:false,“durable”:true,“internal”:false,“arguments”:{}}
X/api/exchanges/vhost/name/binds/source 列出指定交换器中的所有绑定关系,此交换器需要为绑定关系的源端
X/api/exchanges/vhost/name/publish 向指定的交换器中发送一条消息,对应的内容可以参考 : {“properties”:{} ,“routing_key”:“my key”,"payload ":“my body”,“payload_encoing” :“string”}
X/api/queues 列出所有的队列信息
X/api/queues/vhost 列出指定vhost下所有的队列信息
XXX/api/queues/vhost/name GET方法列出执行队列的信息,PUT就去可以声明一个队列,对应的内容可以参考 : {“auto_delete”:false,“durable”:true,“arguments”:{},“node”:“rabbit@smacmullen”} 其中所有的项都是可靠的,DELETE用来删除一个队列,当然可以指定一个if-empty或者fi-unused参数
X/api/queues/vhost/name/contents 清空(purge)指定的队列
X/api/queues/vhost/name/actions 对指定的队列附加一些动作,对应的内容可以参考 : {“action”:“sync”} 目前仅支持sync和cancel_sync
X/api/queues/vhost/name/get 指定队列中获取消息,对应的内容可以参考,{“count”:5 ,“requeue”:true,“encoding”:“auto”,“truncate”:50000} count表示最大能在争取的消息个数,实际上可能小于这个值,requeue表示获取到这个消息时是否从队列中删除,如果requeue为true,则消息不会被删除,但是消息的redelivered标示会被设置,encoding表示编码格式,两种取值:auto和base64 ,auto 指如果消息符合UTF-8格式,则返回String类型,否则为base64类型,trucate如果消息的paylooooooad超过指定大小则会被截断,除了truncate,其余项都必需的,注意这个接口是用来做测试用的,如果要持续消费队列消息,需要采用其他的方法
x/api/binddings 列出所有的绑定关系的信息
XX/api/bindings/vhost/e/exchange/q/queue GET方法列出一个指定的交换器和一个指定的队列中所有的绑定关系的信息,注意一个交换器和一个队列之间可以绑定多次,POST用来添加绑定关系,对应的内容可以参考 : {“routing_key”:“my_routing_key”,“arguments”:{}}其中所有的项都是可选的
XX/api/bindings/vhost/e/source/e/destination/props 与接口/api/bindings/vhost/e/exchange/q/queue/props 相似 ,只不过是两个交换器之间的关系
X/api/vhosts 列出所有的vhost的信息
XXX/api/vhosts/name GET方法列出指定的vhost的信息,PUT方法用来添加一个vhost,host通常只有一个名字,所以不需要任何内容以做请求之用,DELETE方法用来删除一个vhost
X/api/vhosts/name/permissions 列出指定vhost的所有权限信息
X/api/users 列出所有的用户信息
XXX/api/users/name GET方法列出指定的用户信息,POST方法用来添加一个用户,对应的内容参考 {“password”:“secret”,“tags”:“administrator” } 或者 {“password_hash”:“9832898939832”,“tags”:“administory”} ,其中tags是必需的,用来标识用户的角色,详细内容可以,对于password或者password_hash 而言,两者可以选择其一,如果password_hash为“ ”
X/api/aliveness-test/vhost 声明一个队列,并基于其上的生产和消费一条消息,用来测试系统是否运行完好,这个接口可以方便一些监控工具,如Zabbix的调用,如果系统运行完好,调用这个接口会返回{“status”:“ok”,状态码是200}
X/api/healthchecks/node 对当前节点中进行基本的健康检查,包括RabbitMQ应用,信道,队列是否正常运行且无告警,如果一切正常则接口返回:{“status”:“ok”} ,如果有异常则接口返回 , {“status”:“failed”,“reason”:“string”,不管正常与否,状态都是200}
X/api/healthchecks/node/node 对指定节点进行基本的健康检查,其余同 /api/healthchecks/node

   HTTP API接口通常用来方便客户端的调用,如果单纯的使用curl的方式来调用,rabbitmqadmin会显得 更加方便,rabbiiiiiiitmqadmin也是RabbitMQ Management插件提供的功能,它会包装Http API 接口, 使其调用显得更加简洁方便,如前面创建的,显示和删除队列queue就可以这么做:
  # ./rabbitmqadmin -u root -p root123 declare queue name=queue1 queue declared
  # ./rabbitmqadmin list queues
  # ./rabbitmqadmin -u root -p root123 delete queue name=queue1 queue declared
  # ./rabbitmqadmin list queues
  # no Items
   rabbitmqadmin 是需要安装的,不过这个步骤非常简单,可以点击Web页面的左下角的“Command Line” 跳转到 “rabbitmqadmin“页面进行下载,或者可以通过下面的示例再进行下载。
  # wget http://19222.168.0.2:15672/cl/rabbitmqadmin
  下载rabbitmqadmin到当前目录下,之后为其添加可执行权限,在使用rabbitmqadmin前还要确保己经成功安装Python,Python的版本需要2.x,下面的示例来显示当前Python版本
  # python
  如果一一列举rabbitmqadmin的用法未免太过于兴师动众,可以通过rabbitmqadmin --help 命令来得到相应的使用方式。
  #./rabbitmqadmin --help

小结

  本章内容主要是围绕着rabbitmq的管理这个主题展开的,包括多租用户,权限,应用,和集群管理,服务状态等方面,这些都可以通过rabbitmqctl这一系列的工具来管理,rabbitmqctl 也是RabbitMQ复杂的CLI管理工具,本文也包含了大部分的rabbitmqctl 工具使用的细节,在使用相关的命令时,完全可以把本文的内容作为一个手册来查阅,本文还有一个重点就是rabbitmq_management插件,它提供了用户图形化管理功能之余,还提供了相应的监控功能,不仅如此,rabbitmq_management插件还提供了HTTP API 接口以方便用户调用,接下来,我们继续来学习后面的章节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值