Go RabbitMQ (一)

RabbitMQ

簡介

RabbitMQ是一個消息代理,用來負責接收和轉發消息。git

術語

  • 生產者:生產者是負責發送消息的
  • 隊列:隊列是RabbitMQ用來存儲消息的,受主機內存和磁盤大小的限制,本質上是一個消息的緩衝區。生產者能夠將消息發送至隊列中,消費者能夠從隊列中接收到消息
  • 消費者:消費者是用來等待接收消息

生產者,消費者,代理能夠駐留在不一樣主機或同一主機,一個應用能夠是生產者也能夠是消費者github

Hello World

接下來咱們來實現RabbitMQ的「Hello World」,生產者將「Hello World」發送進隊列中,消費者將其接收並打印數組

  • RabbitMQ客戶端的安裝
    • RabbitMQ實現了不少協議,在這裏咱們使用的是的AMQP 0-9-1,這是一種用於消息傳遞的開放通用協議。同時有不少關於RabbitMQ的客戶端,在這裏咱們使用的是Go amqp客戶端
    • 安裝: **go get github.com/streadway/amqp
發送
  • 鏈接RabbitMQ異步

    conn,err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    RabbitMQ的鏈接已經爲咱們抽象了socket的鏈接,同時爲咱們處理了協議版本號和身份認證等等socket

  • 建立通道編碼

    ch,err := conn.Channel()
    if err != nil {
        log.Fatal(err)
    }
    defer ch.Close()

    在使用其餘API完成任務的時候咱們首先經過以上方式建立通道代理

  • 在開始發送消息以前咱們首先應該聲明一個隊列。聲明隊列以後咱們就能夠將消息發送至隊列當中code

    q, err := ch.QueueDeclare(
    "hello", // name
    false,   // durable
    false,   // delete when unused
    false,   // exclusive
    false,   // no-wait
    nil,     // arguments
    )
    if err != nil {
        log.Fatal(err)
    }
    body := "Hello World!"
    err = ch.Publish(
    "",     // exchange
    q.Name, // routing key
    false,  // mandatory
    false,  // immediate
    amqp.Publishing {
    ContentType: "text/plain",
    Body:        []byte(body),
    })
    if err != nil {
        log.Fatal(err)
    }

    隊列的聲明是一個冪等性操做,若是不存在該隊列的話則會建立。此處注意,若是隊列存在,修改了隊列參數並不會影響已經存在的隊列,而且會返回錯誤。消息內容是一個字節數組,因此咱們必須進行編碼rabbitmq

接收
  • 鏈接,建立通道,隊列隊列

    在接收端咱們一樣須要像發送端同樣鏈接RabbitMQ,建立通道後再建立隊列,注意此處隊列的建立是跟發送端的隊列徹底匹配的。隊列在接收端也建立是由於咱們接收端有可能比發送端先啓動,因此爲了保證咱們要消費的隊列存在咱們在此處也進行建立

  • 消費消息

    msgs, err := ch.Consume(
    q.Name, // queue
    "",     // consumer
    true,   // auto-ack
    false,  // exclusive
    false,  // no-local
    false,  // no-wait
    nil,    // args
    )
    if err != nil {
        log.Fatal(err)
    }   
    forever := make(chan bool)
    go func() {
    for d := range msgs {
    log.Printf("Received a message: %s", d.Body)
    }
    }()
    log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
    <-forever

    使用通道消費隊列中的消息,當隊列有消息的時候將會異步的推送給咱們

相關文章
相關標籤/搜索