消息队列之RabbitMQ(三)— 参数说明

556 阅读5分钟

RabbitMQ中创建交换机Exchange和队列Queue时会有很多的参数,下面就逐一来介绍这些参数的含义和实际的用途

交换机Exchange

创建交换机的代码如下:

err = ch.ExchangeDeclare(
        "logs",   // name 
        "fanout", // type
        true,     // durable
        false,    // auto-deleted
        false,    // internal
        false,    // no-wait
        nil,      // arguments
    )
  • name:交换机的名称
  • type:交换机类型,有 fanout,driect,topic,header
  • durableRabbitMQ关闭后,没有持久化的exchange就会被删除掉,注意:此处的持久化是指持久化交换机,不是消息
  • auto-deleted:是否自动删除,如果为true,那么queue绑定到它时就会被自动删除
  • internal:表示是否是内置的交换机,如果为true,那么只能将其与其他的交换机绑定
  • no-await:表示当声明一个交换机时是否需要服务器的返回,如果设置为true则不需要服务器返回
  • arguments:结构化参数,这个就是当type=header时的绑定的参数
队列Queue

创建队列的代码如下所示:

q, err := ch.QueueDeclare(
        "",    // name
        false, // durable
        false, // auto-delete
        true,  // exclusive
        false, // no-wait
        nil,   // arguments
    )
  • name:队列的名称

  • durable:队列是否持久化,如果为false的话,RabbitMQ关闭之后这个队列就会被删除掉

  • audo-delete:如果所有的消费者都断开了连接之后,是否自动删除该队列;如果还没有消费者从该队列获取过消息或者监听该队列,那么该队列不会删除.只有在有消费者从该队列获取过消息后,该队列才有可能自动删除(当所有消费者都断开连接,不管消息是否获取完)

  • exclusive:是否是排他队列,排他队列就是只对当前连接的多个channel可见,对于其他的RabbitMQ Connection是不可见的,并且当该连接断开之后,队列就会自动被删除掉,即便是设置为持久化

  • arguments:创建队列时的一些参数,

    • x-message-ttl:消息的生存期,表示发送到队列的消息在丢弃之前可以存活多长时间(毫秒)
    • x-expires:队列的生存期,队列在被自动删除(毫秒)之前可以使用多长时间
    • x-max-length: 队列最多可以容纳多少条消息
    • x-max-length-bytes:队列最多容纳的消息的字节数
    • x-dead-letter-exchange:溢出的消息需要发送到绑定该死信交换机的队列
    • x-overflow:队列溢出后后续的消息该如何处理
    • x-dead-letter-routing-key:当队列中的消息的生存期到了,或者因长度限制被丢弃时,消息会被推送到与这台交换机绑定的队列中,而不是直接丢掉.
    • x-dead-letter-routing-key: 溢出的消息需要发送到绑定该dead-letter的交换机,并且路由键匹配的队列
    • x-max-priority:设置该队列中的消息的优先级最大值.发布消息的时候,可以指定消息的优先级,优先级高的先被消费.如果没有设置该参数,那么该队列不支持消息优先级功能.也就是说,就算发布消息的时候传入了优先级的值,也不会起什么作用.
    • x-queue-mode:设置队列为懒人模式.该模式下的队列会先将交换机推送过来的消息(尽可能多的)保存在磁盘上,以减少内存的占用.当消费者开始消费的时候才加载到内存中;如果没有设置懒人模式,队列则会直接利用内存缓存,以最快的速度传递消息
    • x-queue-master-locator: 将队列设置为主位置模式,确定在节点集群上声明时队列主机所在的规则
发布消息

发布消息的代码如下:

err = ch.Publish(
        "logs_direct",         // exchange
        "", // routing key
        false, // mandatory
        false, // immediate
        amqp.Publishing{ //msg
            ContentType: "text/plain",
            Body:        []byte(body),
        })
  • exchange:交换机名称

  • routingKey:路由消息的key

  • mandatory:当为true时如果没有队列绑定该交换机,那么消息就会被返回给生产者;否则消息会直接被丢掉

  • immediateimmediate参数告诉服务器,如果该消息关联的队列上有消费者、则立即投递;如果所有匹配的队列上都没有消费者,则直接将消息返回给生产者,不用将消息存入队列而等待消费者。

  • msg:发布消息体

    • content_type: 消息内容的类型,如 application/json
    • content_encoding: 消息内容的编码格式,如:UTF-8
    • priority: 消息的优先级
    • correlation_id: 用于将RPC响应与请求相关联.
    • reply_to: 实现响应消息的路由
    • expiration: 消息过期时间,单位毫秒.该参数值优先级>队列参数设置中的消息生存期
    • message_id: 消息id
    • timestamp:消息创建的时间
    • type:定义消息类型,这是发布者和接收者之间的一种约定
    • devlivery-mode:将消息写入磁盘或者内存队列,值为:Transient(存入内存),Persistent(存入磁盘)
    • user_id: 创建的用户id,如:guest
    • app_id: 应用程序id
    • cluster_id: 集群id
消费消息

消费消息的代码如下:

msgs, err := ch.Consume(
        q.Name, // queue
        "",     // consumer
        true,   // auto ack
        false,  // exclusive
        false,  // no local
        false,  // no wait
        nil,    // args
    )
  • Name:消息队列的名称
  • consumer:消费者的名称
  • auto ack:自动应答,当为true时,消费者接收到消息之后就会自动应答broker,而不会管消息是否被处理,应答之后,消息队列中就会删掉此条消息;当为false时则需要手动的给broker发送ack进行确认
  • exclusive:表示是否为独占的,为true时,此队列只能被一个消费者消费,当断开连接时此队列就会被删除掉;当为true时表示此队列可以同时被多个消费者公平的消费
  • no local:功能属于AMQP协议的标准,但是rabbitMQ并没有做实现
  • no wait:当为true时,表示创建的消费者不会等得到服务确认请求就开始消费消息,但这样有可能会消费消息失败而导致一个通道异常,从而关闭通道;所以一般设置为true
  • args:可选参数
队列绑定交换机
err = ch.QueueBind(
        q.Name, // name
        "", // key
        "", // exchange name
        false, // nowait
        nil) //args
  • Name:队列名称
  • key:用来绑定队列和交换器的路由键
  • exchangeName:绑定的交换机的名称
  • noWait:当为true时,则不会等待服务端确认请求;如果为false则队列绑定不成功就会关闭队列并且报错
  • args:定义绑定的一些参数