美文网首页
RabbitMQ学习

RabbitMQ学习

作者: 无玄 | 来源:发表于2021-08-04 22:59 被阅读0次
    RabbitMQ介绍

    RabbitMQ 拥有数以万计的用户,是最受欢迎的开源消息代理之一, 可以为应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。RabbitMQ 是 AMQP 协议的一个开源实现,是轻量级的,易于在本地和云中部署,它支持多种消息传递协议。RabbitMQ 可以部署在分布式和联合配置中,以满足大规模、高可用性的需求。

    AMQP 0-9-1 模型简介

    摘自:AMQP 0-9-1 模型简介
    AMQP 0-9-1的工作过程如下图:消息(message)被发布者(publisher)发送给交换机(exchange),交换机常常被比喻成邮局或者邮箱。然后交换机将收到的消息根据路由规则分发给绑定的队列(queue)。最后AMQP代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。


    发布者(publisher)发布消息时可以给消息指定各种消息属性(message meta-data)。有些属性有可能会被消息代理(brokers)使用,然而其他的属性则是完全不透明的,它们只能被接收消息的应用所使用。

    从安全角度考虑,网络是不可靠的,接收消息的应用也有可能在处理消息的时候失败。基于此原因,AMQP模块包含了一个消息确认(message acknowledgements)的概念:当一个消息从队列中投递给消费者后(consumer),消费者会通知一下消息代理(broker),这个可以是自动的也可以由处理消息的应用的开发者执行。当“消息确认”被启用的时候,消息代理不会完全将消息从队列中删除,直到它收到来自消费者的确认回执(acknowledgement)。

    在某些情况下,例如当一个消息无法被成功路由时,消息或许会被返回给发布者并被丢弃。或者,如果消息代理执行了延期操作,消息会被放入一个所谓的死信队列中。此时,消息发布者可以选择某些参数来处理这些特殊情况。

    队列,交换机和绑定统称为AMQP实体(AMQP entities)。

    AMQP是一个可编程的协议

    AMQP 0-9-1是一个可编程协议,某种意义上说AMQP的实体和路由规则是由应用本身定义的,而不是由消息代理定义。包括像声明队列和交换机,定义他们之间的绑定,订阅队列等等关于协议本身的操作。

    这虽然能让开发人员自由发挥,但也需要他们注意潜在的定义冲突。当然这在实践中很少会发生,如果发生,会以配置错误(misconfiguration)的形式表现出来。

    应用程序(Applications)声明AMQP实体,定义需要的路由方案,或者删除不再需要的AMQP实体。

    交换机和交换机类型

    交换机是用来发送消息的AMQP实体。交换机拿到一个消息之后将它路由给一个或零个队列。它使用哪种路由算法是由交换机类型和被称作绑定(bindings)的规则所决定的。AMQP 0-9-1的代理提供了四种交换机

    Name(交换机类型) Default pre-declared names(预声明的默认名称)
    Direct exchange(直连交换机) (Empty string) and amq.direct
    Fanout exchange(扇型交换机) amq.fanout
    Topic exchange(主题交换机) amq.topic
    Headers exchange(头交换机) amq.match (and amq.headers in RabbitMQ)

    除交换机类型外,在声明交换机时还可以附带许多其他的属性,其中最重要的几个分别是:

    • Name
    • Durability (消息代理重启后,交换机是否还存在)
    • Auto-delete (当所有与之绑定的消息队列都完成了对此交换机的使用后,删掉它)
    • Arguments(依赖代理本身)

    交换机可以有两个状态:持久(durable)、暂存(transient)。持久化的交换机会在消息代理(broker)重启后依旧存在,而暂存的交换机则不会(它们需要在代理再次上线后重新被声明)。然而并不是所有的应用场景都需要持久化的交换机。

    RabbitMQ基本概念

    摘自:消息队列之 RabbitMQ

    1. Message
      消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
    2. Publisher
      消息的生产者,也是一个向交换器发布消息的客户端应用程序。
    3. Exchange
      交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
    4. Binding
      绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
    5. Queue
      消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
    6. Connection
      网络连接,比如一个TCP连接。
    7. Channel
      信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
    8. Consumer
      消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
    9. Virtual Host
      虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
    10. Broker
      表示消息队列服务器实体。

    运行管理

    参考rabbitmq常用命令rabbitmqctl

    1. 服务器启动与关闭
          启动: rabbitmq-server –detached
          关闭: rabbitmqctl stop
          若单机有多个实例,则在rabbitmqctlh后加–n 指定名称
    

    2). 插件管理

          开启某个插件:rabbitmq-plugins enable xxx
          关闭某个插件:rabbitmq-plugins disablexxx
          注意:重启服务器后生效。
    

    3).virtual_host管理

          新建virtual_host: rabbitmqctl add_vhost  xxx
          撤销virtual_host: rabbitmqctl delete_vhost xxx
    

    4). 用户管理

          新建用户: rabbitmqctl add_user xxxpwd
          删除用户: rabbitmqctl delete_user xxx
          改密码: rabbimqctl change_password {username} {newpassword}
          设置用户角色: rabbitmqctl set_user_tags {username} {tag ...}
                  Tag可以为 administrator,monitoring, management
    

    5). 权限管理

        权限设置:set_permissions [-pvhostpath] {user} {conf} {write} {read}
                   Vhostpath
                   Vhost路径
                   user
          用户名
                  Conf
          一个正则表达式match哪些配置资源能够被该用户访问。
                  Write
          一个正则表达式match哪些配置资源能够被该用户读。
                   Read
          一个正则表达式match哪些配置资源能够被该用户访问。
    

    6). 获取服务器状态信息

        服务器状态:rabbitmqctl status  
           队列信息:rabbitmqctl list_queues[-p vhostpath] [queueinfoitem ...]
                    Queueinfoitem可以为:name,durable,auto_delete,arguments,messages_ready,
                    messages_unacknowledged,messages,consumers,memory             
           Exchange信息:rabbitmqctllist_exchanges[-p vhostpath] [exchangeinfoitem ...]
                     Exchangeinfoitem有:name,type,durable,auto_delete,internal,arguments.
           Binding信息:rabbitmqctllist_bindings[-p vhostpath] [bindinginfoitem ...]       
                     Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments                
           Connection信息:rabbitmqctllist_connections [connectioninfoitem ...]       
           Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。     
           Channel信息:rabbitmqctl  list_channels[channelinfoitem ...]       
          Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked
    
    基本配置

    参考rabbitmq基础配置中文说明文档

    工作模式

    简单模式

    一个生产者,一个消费者,一个队列。

    队列模式

    一个生产者,多个消费者,一个队列。

    订阅与发布模式(fanout)

    一个生产者,一个交换机(fanoutExchange),没有路由规则,多个消费者,多个队列。

    路由模式(direct)

    一个生产者,一个交换机(directExchange),路由规则,多个消费者,多个队列。

    主题模式(topic)

    一个生产者,一个交换机(topicExchange),模糊匹配路由规则,多个消费者,多个队列,“#”匹配一个词或多个词,“*”只匹配一个词。

    RPC模式

    多个生产者,多个消费者,路由规则,多个队列。

    总结

    订阅模式,路由模式,主题模式,都使用了交换机,只不过在发送消息给队列时,添加了不同的路由规则。订阅模式为广播路由规则,路由模式为完全匹配规则,主题模式有正则表达式、完全匹配规则。

    SpringBoot 整合RabbitMQ

    参考SpringBoot 整合RabbitMQ

    相关文章

      网友评论

          本文标题:RabbitMQ学习

          本文链接:https://www.haomeiwen.com/subject/vkrhpltx.html