Golang RabbitMQ: 搭建可擴(kuò)展的消息傳遞系統(tǒng)

小云
102
2023-10-08 15:23:33

要搭建一個(gè)可擴(kuò)展的消息傳遞系統(tǒng),可以使用Golang和RabbitMQ的組合。RabbitMQ是一個(gè)功能強(qiáng)大的消息代理,用于在應(yīng)用程序之間傳遞消息。

下面是搭建可擴(kuò)展消息傳遞系統(tǒng)的步驟:

  1. 安裝RabbitMQ:首先要在系統(tǒng)上安裝RabbitMQ。根據(jù)您的操作系統(tǒng),可以按照RabbitMQ的官方文檔進(jìn)行安裝。

  2. 創(chuàng)建生產(chǎn)者:使用Golang編寫一個(gè)生產(chǎn)者應(yīng)用程序,該程序?qū)a(chǎn)生需要傳遞的消息??梢允褂肦abbitMQ的Golang客戶端庫(kù),例如github.com/streadway/amqp

package main
import (
"log"
"github.com/streadway/amqp"
)
func main() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatalf("Failed to connect to RabbitMQ: %v", err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatalf("Failed to open a channel: %v", err)
}
defer ch.Close()
q, err := ch.QueueDeclare(
"myQueue", // 隊(duì)列名稱
false,     // 是否持久化
false,     // 是否自動(dòng)刪除
false,     // 是否獨(dú)占
false,     // 是否等待服務(wù)器響應(yīng)
nil,       // 額外參數(shù)
)
if err != nil {
log.Fatalf("Failed to declare a queue: %v", err)
}
body := "Hello, RabbitMQ!"
err = ch.Publish(
"",     // 交換機(jī)名稱
q.Name, // routing key
false,  // 是否等待服務(wù)器響應(yīng)
false,  // 是否立即發(fā)布
amqp.Publishing{
ContentType: "text/plain",
Body:        []byte(body),
},
)
if err != nil {
log.Fatalf("Failed to publish a message: %v", err)
}
log.Println("Message published")
}
  1. 創(chuàng)建消費(fèi)者:使用Golang編寫一個(gè)消費(fèi)者應(yīng)用程序,該程序?qū)⒔邮丈a(chǎn)者發(fā)送的消息并進(jìn)行處理。
package main
import (
"log"
"github.com/streadway/amqp"
)
func main() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatalf("Failed to connect to RabbitMQ: %v", err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatalf("Failed to open a channel: %v", err)
}
defer ch.Close()
q, err := ch.QueueDeclare(
"myQueue", // 隊(duì)列名稱
false,     // 是否持久化
false,     // 是否自動(dòng)刪除
false,     // 是否獨(dú)占
false,     // 是否等待服務(wù)器響應(yīng)
nil,       // 額外參數(shù)
)
if err != nil {
log.Fatalf("Failed to declare a queue: %v", err)
}
msgs, err := ch.Consume(
q.Name, // 隊(duì)列名稱
"",     // 消費(fèi)者標(biāo)識(shí)符
true,   // 是否自動(dòng)應(yīng)答
false,  // 是否排他消費(fèi)者
false,  // 是否阻塞等待服務(wù)器響應(yīng)
false,  // 額外參數(shù)
)
if err != nil {
log.Fatalf("Failed to register a consumer: %v", err)
}
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Println("Waiting for messages...")
<-forever
}
  1. 運(yùn)行生產(chǎn)者和消費(fèi)者應(yīng)用程序:分別運(yùn)行生產(chǎn)者和消費(fèi)者應(yīng)用程序,它們將連接到RabbitMQ代理并進(jìn)行消息的發(fā)送和接收。
go run producer.go
go run consumer.go

生產(chǎn)者應(yīng)

0