Chế Độ Hàng Đợi Đơn Giản của 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)
}
}