2017-04-18 118 views
1

以下是我使用的发布商代码。它在消息从队列中取出之前需要ack。假设从消费者那里得到Ack或nack(在代码的底部)。如果你只是自己运行下面的发布代码(而不是同时运行一个消费者代码),它假设只是挂起,等待ack或nack,但它没有,它打印出一个确认就好像一个消费者发送了它。所以我很困惑,如果我有任何代码的一部分是错误的。没有消费者,但是当我发布ack的东西时会立即返回为什么? (golang/rabbitmq)

为我所用代码的RabbitMQ的官方教程中的基本代码:https://www.rabbitmq.com/tutorials/tutorial-one-go.html

对于代码的ACK/NACK部分我也跟着这样的:https://agocs.org/blog/2014/08/19/rabbitmq-best-practices-in-go/

package main 

import (
    "log" 
    "github.com/streadway/amqp" 
) 

func failOnError(err error, msg string) { 
    if err != nil { 
     log.Fatalf("%s: %s", msg, err) 
    } 
} 

func main() { 

    conn, err := amqp.Dial("amqp://guest:[email protected]:5672/") 
    failOnError(err, "Failed to connect to RabbitMQ") 
    defer conn.Close() 

    ch, err := conn.Channel() 
    failOnError(err, "Failed to open a channel") 
    defer ch.Close() 

    ch.Confirm(false) 

    ack, nack := ch.NotifyConfirm(make(chan uint64, 1), make(chan uint64, 1)) 

    q, err := ch.QueueDeclare(
     "hello", // name 
     false, // durable 
     false, // delete when unused 
     false, // exclusive 
     false, // no-wait 
     nil,  // arguments 
    ) 
    failOnError(err, "Failed to declare a queue") 

    body := "hello" 
    err = ch.Publish(
     "",  // exchange 
     q.Name, // routing key 
     true, // mandatory 
     false, // immediate 
     amqp.Publishing{ 
      ContentType: "text/plain", 
      Body:  []byte(body), 
     }) 
    log.Printf(" [x] Sent %s", body) 
    failOnError(err, "Failed to publish a message") 

    select { 
     case tag := <-ack: 
      log.Println("Acked ", tag) 
     case tag := <-nack: 
      log.Println("Nack alert! ", tag) 
    } 
} 

回答

2

你混淆了出版商确认ACK和NACK与消费者方面和nacks。

的文档状态:

对于不可路由的消息,一旦 交换验证的消息不会路由到任何队列(返回队列空 列表)的经纪人会发出确认。如果该消息也作为强制发布,则在basic.ack之前将basic.return发送给客户端。对于否定确认(basic.nack), 也是如此。

对于可路由消息,当消息被所有队列接受时,发送basic.ack。对于路由到持久的 队列的持久性消息,这意味着持久化到磁盘。对于镜像队列,这意味着 所有镜像都接受了该消息。

所以你看到了正确的行为。 RabbitMQ确认消息到达队列。

+0

因为如果Rabbit等到ack一个pub,直到这个消息被消耗并且被acked,它将完全破坏消息队列的整个目的。 – Adrian

相关问题