RabbitMQ 基本知识笔记

RabbitMQ

1. 安装(CentOS7):

准备依赖环境

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

下载安装rabbitmq, erlang, socat

  1. 下载RabbitMQ: https://packagecloud.io/rabbitmq/rabbitmq-server

    image

    wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm
    
  2. erlang下载网站: https://packagecloud.io/rabbitmq/erlang

    image

    wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/download.rpm
    
  3. 下载 socat(rabbitmq 依赖socat)

    wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
    
  4. 安装

    rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm
    rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
    rpm -ivh rabbitmq-server-3.10.0-1.el7.noarch.rpm
    

启动 RabbitMQ

  • 启动rabbitmq-server start rabbitmq-server -detached 后台启动

  • 停止rabbitmqctl stop

  • 管理插件: rabbitmq-plugins enable rabbitmq_management

  • 访问地址http://192.168.10.127:15672/

  • 默认用户: guest 密码: guest

  • 验证rabbitmq是否启动

    • lsof -i:5672 // lsof -i :22 知道22端口被哪个进程占用
    • netstat -lnp|grep 5672 查看5672端口被哪个进程占用

2. RabbitMQ 管理命令

官方文档:https://www.rabbitmq.com/rabbitmqctl.8.html

服务管理

  1. 关闭应用:rabbitmqctl stop_app
  2. 启动应用:rabbitmqctl start_app
  3. 节点状态:rabbitmqctl status

插件管理

  1. 查看插件列表:rabbitmq-plugins list
  2. 安装管理插件:rabbitmq-plugins enable rabbitmq_managenment
  3. 卸载管理插件:rabbitmq-plugins disable rabbitmq_managenment
  4. 访问地址:http://192.168.11.76:15672
  5. 日子文件路径:
    /var/log/rabbitmq/rabbit@localhost.log
    /var/log/rabbitmq/rabbit@localhost-sasl.log
  6. 路径: /usr/local/software

用户管理

  1. 添加用户:rabbitmqctl add_user username password
  2. 列出所有用户:rabbitmqctl list_users
  3. 删除用户: rabbitmqctl delete_user username
  4. 修改密码:rabbitmqctl change_password username newpassword

用户角色管理

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

  1. 超级管理员(administrator)

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

  2. 监控者(monitoring)

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

  3. 策略制定者(policymaker)
    可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。

  4. 普通管理者(management)

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

  5. 其他

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

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

设置用户角色命令:rabbitmqctl set_user_tags User Tag

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

也可以给同一用户设置多个角色: rabbitmqctl set_user_tags hncscwc monitoring policymaker

用户权限管理

  1. 列出用户权限:rabbitmqctl list_user_permissions username
  2. 设置用户权限:rabbitmqctl set_permissions --vhost / ghw ".*" ".*" ".*"
  3. 清除用户权限:rabbitmqctl clear_permissions --vhost vhostpath username

虚拟主机(vhosts)管理

  1. 创建虚拟主机: rabbitmqctl add_vhost vhostpath
  2. 列出所有虚拟主机: rabbitmqctl list_vhosts
  3. 列出虚拟主机上所有权限:rabbitmqctl list_permissions --vhost /
  4. 删除虚拟主机:rabbitmqctl delete_vhost vhostpath

队列操作

  1. 查看所有队列:rabbitmqctl list_queues --vhost /
  2. 清除队列里的消息:rabbitmqctl --vhost test purge_queue QueueName

高级操作

  1. 移除所有数据,要在rabbitmqctl stop_app 之后使用:rabbitmqctl reset
  2. 组成集群命令:rabbitmqctl join_cluster <clusternode> [--ram]
  3. 查看集群状态: rabbitmqctl cluster_status
  4. 修改集群节点的存储形式:rabbitmqctl change_cluster_node_type disc | ram
  5. 忘记节点(摘除节点): rabbitmqctl forget_cluster_node [--offline]
  6. 修改节点名称:rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2 ...]

消息生产与消费

  1. ConnectionFactory: 获取连接工厂
  2. Connection: 一个连接
  3. Channel: 数据通信信道,已发送和接收消息
  4. Queue: 具体的消息存储队列
  5. Producer & Consumer 生产和消费者

Exchange 交换机

Exchange: 接收消息,并根据路由建转发消息所绑定的队列
image

交换机属性

  1. Name: 交换机名称
  2. Type: 交换机类型 direct , topic, fanout, headers
  3. Durability: 是否需要持久化,true为持久化
  4. Atuto Delete: 当最后一个绑定到Exchange 上的队列删除后,自动删除该Exchange
  5. internal: 当前Exchange 是否用于RabbitMQ 内部使用,默认为False
  6. Arguments: 扩展参数,用于扩展AMQP 协议自定化使用

交换机类型

1. Fanout Exchange

  • 这种Fanout模式不处理路由键,你需要简单的讲队列绑定到exchange上,一个发送到exchange的消息都会被转发到与该exchange绑定的所有队列上。很像广播子网,每台子网内的主机都获得了一份复制的消息。Fanout类型的Exchange转发消息是最快的。下面看一张图;

    image

  • 从上面这张图中我们发现,在这种模式中增加了Exchange的概念,这就说生产者会创建一个Exchange,并且将消息发送到exhange中,其余的事情不在关心,并且这种模式中,我们会发现拥有多个消费者,并且每个消费者都有一个独立的消息队列。 每个队列都需要绑定到exchange上面。生产者发送的消息,经过exchange到达队列,从而实现一个消息被多个消费者获取的目的。下面看一个比较简单的图

    image

  • 在这种模式中我们需要注意的,如果将消息发送到一个没有队列绑定的exchange上面,那么该消息将会丢失,这是因为在rabbitmq中exchange是不具备存储消息的能力,只有队具备存储消息的能力。

2. Direct Exchange : 所有发送到Direct Exchange 的消息被转发到RouteKey中指定的Queue

  • 注意: Direct 模式可以使用RabbitMQ自带的Exchange:default Exchange,所以不需要将Exchange进行任何绑定(binding)操作,消息传递时,RouteKey必须完全匹配才会被队列接收,否则该消息会被抛弃。

    image

  • 这种模式就要去我们生产者在发送消息的时候,为此消息添加一个路由键,这样在消费者获取的时候才能达到“按需索取”。例如:将不同的级别的错误消息传递给不同的消费者,这就需要用到这种模式:

    image

3. Topic Exchange

任何发送到Topic Exchange的消息都会被转发到所有关心routing_key中指定话题的Queue上

  1. 这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(routing_key),Exchange会将消息转发到所有关注主题能与routing_key模糊匹配的队列。

  2. 这种模式需要routing_key,也许要提前绑定Exchange与Queue。

  3. 在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个routing_key为”MQ.log.error”的消息会被转发到该队列)。

  4. “#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。

  5. 同样,如果Exchange没有发现能够与routing_key匹配的Queue,则会抛弃此消息。

    image

    上面这张图根据颜色进行了路由键匹配的划分,下面四个队列中第一个红色队列,我们会发现它的路由键为“usa.#”这说明凡是路由键以“usa.”开头的消息都会被路由到这个队列中。第二个黄色队列,说明凡是以“.news”结束的路由键都会被路由到这个队列中。这样的模式是我们在使用过程中更加的灵活。

    image

posted @ 2022-05-10 23:33  郭赫伟  阅读(101)  评论(0编辑  收藏  举报