2017-04-18 39 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

相關問題