Chế Độ Hàng Đợi Đơn Giản của Golang RabbitMQ

Golang RabbitMQ

Giải thích: P đại diện cho người sản xuất, C đại diện cho người tiêu dùng, và màu đỏ đại diện cho hàng đợi.

Lưu ý: Nếu bạn không quen với RabbitMQ, vui lòng đọc phần RabbitMQ Basic Concepts trước.

1. Cài Đặt Các Phụ Thuộc

go get github.com/streadway/amqp

Nhập gói phụ thuộc

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

2. Gửi Tin Nhắn

Các bước sau đây minh họa cách người sản xuất tin nhắn hoàn tất việc đẩy tin nhắn.

2.1. Kết nối đến Máy Chủ RabbitMQ

// Kết nối đến Máy Chủ RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
defer conn.Close()

Giải thích địa chỉ kết nối:

amqp://tênngười dùng:mậtkhẩu@ĐịachỉRabbitMQ:cổng/

2.2. Tạo Một Kênh

Hầu hết các hoạt động được thực hiện trên kênh.

ch, err := conn.Channel()
defer ch.Close()

2.3. Khai Báo Một Hàng Đợi

Đại diện cho hàng đợi chúng ta cần đọc hoặc ghi từ.

q, err := ch.QueueDeclare(
  "hello", // Tên hàng đợi
  false,   // Dữ liệu tin nhắn không bền
  false,   // Xóa hàng đợi khi không sử dụng
  false,   // Độc quyền
  false,   // Không chờ đợi
  nil,     // Đối số
)

2.4. Đẩy Tin Nhắn

// Nội dung tin nhắn
body := "Chào bạn!"

// Đẩy tin nhắn
err = ch.Publish(
  "",     // Trao đổi (bỏ qua ở đây)
  q.Name, // Tham số định tuyến, sử dụng tên hàng đợi làm tham số định tuyến
  false,  // Bắt buộc
  false,  // Ngay lập tức
  amqp.Publishing {
    ContentType: "text/plain",
    Body:        []byte(body),  // Nội dung tin nhắn
  })

2.5. Mã Hoàn Chỉnh Cho Việc Gửi Tin Nhắn

package main

// Nhập gói
import (
	"log"
	"github.com/streadway/amqp"
)

// Xử lý lỗi
func failOnError(err error, msg string) {
	if err != nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// Kết nối đến RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Không thể kết nối đến RabbitMQ")
	defer conn.Close()

	// Tạo một kênh
	ch, err := conn.Channel()
	failOnError(err, "Không thể mở một kênh")
	defer ch.Close()

	// Khai báo hàng đợi để thao tác
	q, err := ch.QueueDeclare(
		"hello", // Tên
		false,   // Bền
		false,   // Xóa khi không sử dụng
		false,   // Độc quyền
		false,   // Không chờ đợi
		nil,     // Đối số
	)
	failOnError(err, "Không thể khai báo hàng đợi")

	// Nội dung tin nhắn cần gửi
	body := "Chào bạn!"

	// Gửi tin nhắn
	err = ch.Publish(
		"",     // Trao đổi
		q.Name, // Khóa định tuyến
		false,  // Bắt buộc
		false,  // Ngay lập tức
		amqp.Publishing{
			ContentType: "text/plain",
			Body:        []byte(body),
		})
	failOnError(err, "Không thể xuất bản một tin nhắn")
	log.Printf(" [x] Đã gửi %s", body)
}

3. Nhận Tin Nhắn

Ba bước đầu tiên của việc nhận tin nhắn giống như việc gửi tin nhắn, tương ứng với các phần 2.1, 2.2 và 2.3 tương ứng. Mã hoàn chỉnh cho việc nhận tin nhắn như sau:

gói chính

// Nhập các gói
nhập (
	Đăng nhập "thông qua"
	"log"
	"github.com/streadway/amqp"
)

// Xử lý lỗi
func failOnError(err error, msg string) {
	nếu err! = nil {
		log.Fatalf("%s: %s", msg, err)
	}
}

func main() {
	// Kết nối với RabbitMQ
	conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
	failOnError(err, "Không thể kết nối với RabbitMQ")
	defer conn.Close()

	// Tạo một kênh
	ch, err := conn.Channel()
	failOnError(err, "Không thể mở một kênh")
	defer ch.Close()
	
	// Khai báo hàng đợi được thao tác
	q, err := ch.QueueDeclare(
		"xin chào", // Tên hàng đợi cần phải phù hợp với tên hàng đợi để gửi tin nhắn
		false,   // bền
		false,   // xóa khi không sử dụng
		false,   // độc quyền
		false,   // không đợi
		nil,     // đối số
	)
	failOnError(err, "Không thể khai báo hàng đợi")

	// Tạo một người tiêu dùng tin nhắn
	msgs, err := ch.Consume(
		q.Name, // Tên hàng đợi
		"",     // Tên người tiêu dùng, nếu không điền, một ID duy nhất sẽ được tạo tự động
		đúng,   // Có tự động nhận tin nhắn không, tức là tự động thông báo cho RabbitMQ rằng tin nhắn đã được xử lý thành công
		false,  // độc quyền
		false,  // không địa phương
		false,  // không đợi
		nil,    // đối số
	)
	failOnError(err, "Không thể đăng ký một người tiêu dùng")
	
	// Lấy tin nhắn từ hàng đợi trong một vòng lặp
	for d: = range msgs {
		// In nội dung tin nhắn
		log.Printf("Nhận được một tin nhắn: %s", d.Body)
	}
}