当前位置: 首页 > article >正文

rabbitmq原理及命令

目录

  • 一、RabbitMQ原理
    • 1、交换机(Exchange)
      • fanout
      • direct
      • topic
      • headers(很少用到)
    • 2、队列Queue
    • 3、Virtual Hosts
    • 4、基础对象
  • 二、RabbitMQ的一些基本操作:
    • 1、用户管理
    • 2、用户角色
    • 3、vhost
    • 4、开启web管理接口
    • 5、批量删除队列

一、RabbitMQ原理

在这里插入图片描述

1、交换机(Exchange)

生产者的消息并不能直接到Queue中,而是经过交换机分配的。一个消息可以分配给一个或者多个queue,分配通过bind进行的。

在这里插入图片描述

在绑定(Binding)Exchange和Queue的同时,一般会指定一个Binding Key,生产者将消息发送给Exchange的时候,一般会产生一个Routing Key,当Routing Key和Binding Key对应上的时候,消息就会发送到对应的Queue中去。那么Exchange有四种类型,接下来就来详细讲解下Exchange里面类型。

fanout

fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中。
在这里插入图片描述
上图所示,生产者(P)生产消息1将消息1推送到Exchange,由于Exchange Type=fanout这时候会遵循fanout的规则将消息推送到所有与它绑定Queue,也就是图上的两个Queue最后两个消费者消费。

direct

direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中
在这里插入图片描述
当生产者(P)发送消息时Rotuing key=booking时,这时候将消息传送给Exchange,Exchange获取到生产者发送过来消息后,会根据自身的规则进行与匹配相应的Queue,这时发现Queue1和Queue2都符合,就会将消息传送给这两个队列,如果我们以Rotuing key=create和Rotuing key=confirm发送消息时,这时消息只会被推送到Queue2队列中,其他Routing Key的消息将会被丢弃。

topic

前面提到的direct规则是严格意义上的匹配,换言之Routing Key必须与Binding Key相匹配的时候才将消息传送给Queue,那么topic这个规则就是模糊匹配,可以通过通配符满足一部分规则就可以传送。它的约定是:

routing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”

binding key与routing key一样也是句点号“. ”分隔的字符串

binding key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

在这里插入图片描述

当生产者发送消息Routing Key=F.C.E的时候,这时候只满足Queue1,所以会被路由到Queue中,如果Routing Key=A.C.E这时候会被同是路由到Queue1和Queue2中,如果Routing Key=A.F.B时,这里只会发送一条消息到Queue2中。

headers(很少用到)

headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。

Exchange规则类型名称Exchange规则类型描述
fanout把所有发送到该Exchange的消息路由到所有与它绑定的Queue中
directRouting Key==Binding Key
topic我这里自己总结的简称模糊匹配
headersExchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。

2、队列Queue

Queue(队列)RabbitMQ的作用是存储消息,队列的特性是先进先出。上图可以清晰地看到Client A和Client B是生产者,生产者生产消息最终被送到RabbitMQ的内部对象Queue中去,而消费者则是从Queue队列中取出数据。可以简化成表示为:
在这里插入图片描述
生产者Send Message “A”被传送到Queue中,消费者发现消息队列Queue中有订阅的消息,就会将这条消息A读取出来进行一些列的业务操作。这里只是一个消费者对应一个队列Queue,也可以多个消费者订阅同一个队列Queue,当然这里就会将Queue里面的消息平分给其他的消费者,但是会存在一个问题就是如果每个消息的处理时间不同,就会导致某些消费者一直在忙碌中,而有的消费者处理完了消息后一直处于空闲状态,因为前面已经提及到了Queue会平分这些消息给相应的消费者。这里我们就可以使用prefetchCount来限制每次发送给消费者消息的个数。详情见下图所示:
在这里插入图片描述
这里的prefetchCount=1是指每次从Queue中发送一条消息来。等消费者处理完这条消息后Queue会再发送一条消息给消费者。

3、Virtual Hosts

在RabbitMQ中可以虚拟消息服务器VirtualHost,每个VirtualHost相当月一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。

4、基础对象

ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。ConnectionFactory为Connection的制造工厂。
  Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。

Connection就是建立一个TCP连接,生产者和消费者的都是通过TCP的连接到RabbitMQ Server中的,这个后续会再程序中体现出来。

Channel虚拟连接,建立在上面TCP连接的基础上,数据流动都是通过Channel来进行的。为什么不是直接建立在TCP的基础上进行数据流动呢?如果建立在TCP的基础上进行数据流动,建立和关闭TCP连接有代价。频繁的建立关闭TCP连接对于系统的性能有很大的影响,而且TCP的连接数也有限制,这也限制了系统处理高并发的能力。但是,在TCP连接中建立Channel是没有上述代价的。

二、RabbitMQ的一些基本操作:

1、用户管理

用户管理包括增加用户,删除用户,查看用户列表,修改用户密码。

(1) 新增一个用户

rabbitmqctl  add_user  Username  Password

(2) 删除一个用户

rabbitmqctl  delete_user  Username

(3) 修改用户的密码

rabbitmqctl  change_password  Username  Newpassword

(4) 查看当前用户列表

rabbitmqctl  list_users

2、用户角色

按照个人理解,用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。

(1) 超级管理员(administrator)

可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。

(2) 监控者(monitoring)

可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
在这里插入图片描述

(3) 策略制定者(policymaker)

可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
在这里插入图片描述
与administrator的对比,administrator能看到这些内容
在这里插入图片描述

(4) 普通管理者(management)

仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。

(5) 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理。

设置用户角色的命令为:

rabbitmqctl set_user_tags User Tag

User为用户名, Tag为角色名(对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称)。

也可以给同一用户设置多个角色,例如

rabbitmqctl set_user_tags hncscwc monitoring policymaker

3、vhost

当我们在创建用户时,会指定用户能访问一个虚拟机,并且该用户只能访问该虚拟机下的队列和交换机,如果没有指定,默认的是”/”;一个rabbitmq服务器上可以运行多个vhost,以便于适用不同的业务需要,这样做既可以满足权限配置的要求,也可以避免不同业务之间队列、交换机的命名冲突问题,因为不同vhost之间是隔离的。

#添加虚拟机
rabbitmqctl add_vhost vhost_one

#删除虚拟机
rabbitmqctl delete_vhost vhost_one

#查看虚拟机列表
rabbitmqctl list_vhosts

用户权限
对何种资源具有配置、写、读的权限通过正则表达式来匹配,具体命令如下:
set_permissions [-p ]
其中, 的位置分别用正则表达式来匹配特定的资源,如’^(amq.gen.*|amq.default)KaTeX parse error: Expected group after '^' at position 29: …的和默认的exchange,'^̲'不匹配任何资源

需要注意的是RabbitMQ会缓存每个connection或channel的权限验证结果、因此权限发生变化后需要重连才能生效。

为用户赋权:
rabbitmqctl set_permissions -p vhost1 user_admin ‘.’ '.’ ‘.*’

该命令使用户user_admin具有vhost1这个virtual host中所有资源的配置、写、读权限以便管理其中的资源

查看权限
rabbitmqctl list_user_permissions user_admin

rabbitmqctl list_permissions -p vhost1

4、开启web管理接口

如果只从命令行操作RabbitMQ,多少有点不方便。幸好RabbitMQ自带了web管理界面,只需要启动插件便可以使用。

rabbitmq-plugins enable rabbitmq_management

访问: http://localhost:15672

5、批量删除队列

# 从内部删除auto_delete 为true的队列,需要有delete_queue 命令
queue_names=$(rabbitmqctl list_queues name auto_delete -p dev2_saasops | grep "true" | awk '{print $1}')
for name in $queue_names; do
    echo "Deleted queue: $name"
	rabbitmqadmin delete_queue $name -p dev2_saasops
done

# 从外部删除auto_delete 为true的队列
QUEUES=$(docker exec -it 7c79cd3a46f1 rabbitmqctl list_queues name auto_delete -p dev2_saasops | grep "true" | awk '{print $1}')
for name in $QUEUES; do
    echo "Deleted queue: $name"
	curl -u paas:123456 -X DELETE "http://192.168.230.112:15672/api/queues/dev2_saasops/$name"
done

http://www.kler.cn/a/414070.html

相关文章:

  • (四)Spring Boot学习——整合修改使用druid连接池
  • java八股-分布式服务的接口幂等性如何设计?
  • DICOM医学影像应用篇——窗宽窗位概念、原理及实现详解
  • notepad++文件github下载
  • 嵌入式开发中Java可以替代Qt吗?
  • 什么是代理,nodenginx前端代理详解
  • Git上传本地项目到远程仓库(gitee/github)
  • Java 与设计模式(14):策略模式
  • QT:多ui界面显示
  • 嵌入式C语言技巧15:深入浅出:多线程编程中锁的选择与优化策略
  • Unity高效编程经验50条分享
  • 达梦docker版本数据库 重新初始化实例--比如大小写敏感参数设置不生效
  • Laravel8.5+微信小程序实现京东商城秒杀方案
  • SQL面试题——in和not in 不支持怎么办
  • 深度学习day6- 损失函数和BP算法1
  • 【从零开始的LeetCode-算法】3304. 找出第 K 个字符 I
  • 分层架构 IM 系统之 Entry 设计实现
  • 跨境电商搭建知识库能带来什么效益?
  • 栈和队列——考研笔记
  • 【论文复现】BERT论文解读及情感分类实战
  • 页面内容下载为pdf
  • 2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素
  • k8s网络服务
  • 【数据仓库 | Data Warehouse】数据仓库的四大特性
  • 为什么redis用跳表不用b+树,而mysql用b+树而不是跳表?
  • CTF之密码学(埃特巴什码 )