在 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,headerdurable:RabbitMQ关闭后,没有持久化的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时如果没有队列绑定该交换机,那么消息就会被返回给生产者;否则消息会直接被丢掉 -
immediate:immediate参数告诉服务器,如果该消息关联的队列上有消费者、则立即投递;如果所有匹配的队列上都没有消费者,则直接将消息返回给生产者,不用将消息存入队列而等待消费者。 -
msg:发布消息体content_type: 消息内容的类型,如application/jsoncontent_encoding: 消息内容的编码格式,如:UTF-8priority: 消息的优先级correlation_id: 用于将RPC响应与请求相关联.reply_to: 实现响应消息的路由expiration: 消息过期时间,单位毫秒.该参数值优先级>队列参数设置中的消息生存期message_id: 消息idtimestamp:消息创建的时间type:定义消息类型,这是发布者和接收者之间的一种约定devlivery-mode:将消息写入磁盘或者内存队列,值为:Transient(存入内存),Persistent(存入磁盘)user_id: 创建的用户id,如:guestapp_id: 应用程序idcluster_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时,表示创建的消费者不会等得到服务确认请求就开始消费消息,但这样有可能会消费消息失败而导致一个通道异常,从而关闭通道;所以一般设置为trueargs:可选参数
队列绑定交换机
err = ch.QueueBind(
q.Name, // name
"", // key
"", // exchange name
false, // nowait
nil) //args
Name:队列名称key:用来绑定队列和交换器的路由键exchangeName:绑定的交换机的名称noWait:当为true时,则不会等待服务端确认请求;如果为false则队列绑定不成功就会关闭队列并且报错args:定义绑定的一些参数