RabbitMQ学习

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学习)