Chế độ chủ đề RabbitMQ của Golang tương tự với chế độ định tuyến (Direct), với điểm khác biệt lớn nhất là các tham số định tuyến trong chế độ chủ đề hỗ trợ định danh mờ. Loại trao đổi cho chế độ chủ đề là 'topic'.

Kiến trúc của chế độ chủ đề như sau: Chế độ chủ đề RabbitMQ

Lưu ý: Nếu bạn không quen với chế độ chủ đề RabbitMQ, hãy đọc mục chế độ chủ đề RabbitMQ trước.

1. Hướng dẫn tiên quyết

Vui lòng đọc các mục sau theo thứ tự:

Lưu ý: Vì mục xuất/nhập Golang RabbitMQ đã chứa các ví dụ mã hoàn chỉnh, chỉ có định nghĩa trao đổi và tham số định tuyến khác với các chế độ RabbitMQ khác. Do đó, chỉ hiển thị mã chính.

2. Khai báo trao đổi chủ đề

err = ch.ExchangeDeclare(
  "tizi365_topic", // Tên trao đổi, cần phải duy nhất
  "topic",         // Loại trao đổi
  true,            // Bền vững
  false,           // Tự động xóa
  false,           // Nội bộ
  false,           // Không chờ
  nil,             // Đối số
)

3. Gửi tin nhắn

    // Nội dung tin nhắn
    body := "Xin chào Tizi365.com!"

    // Gửi tin nhắn
    err = ch.Publish(
        "tizi365_topic",      // Tên trao đổi
        "www.tizi365.com",    // Tham số định tuyến, tham số quan trọng quyết định tin nhắn của bạn sẽ được gửi đến hàng đợi nào
        false,                // Bắt buộc
        false,                // Ngay lập tức
        amqp.Publishing {
            ContentType: "text/plain", // Loại nội dung tin nhắn, ở đây là văn bản thuần
            Body:        []byte(body),  // Nội dung tin nhắn
        })

4. Tiêu thụ tin nhắn

4.1. Buộc trao đổi

// Khai báo hàng đợi được thao tác
    q, err := ch.QueueDeclare(
        "",    // Tên hàng đợi, sẽ được tạo ngẫu nhiên nếu không điền
        false, // Hàng đợi bền vững
        false, // Xóa khi không sử dụng
        true,  // Độc quyền
        false, // Không chờ
        nil,   // Đối số
    )

    // Buộc hàng đợi với trao đổi cụ thể
    err = ch.QueueBind(
        q.Name,             // Tên hàng đợi
        "*.tizi365.com",    // Tham số định tuyến, tham số quan trọng, sử dụng ký tự đại diện * để phù hợp với một từ, nếu sử dụng #, có thể phù hợp với nhiều từ
        "tizi365_topic",    // Tên trao đổi, cần phải khớp với trao đổi được xác định bởi người gửi tin nhắn
        false,
        nil)

4.2. Xử lý tin nhắn

// Tạo người tiêu thụ
    msgs, err := ch.Consume(
        q.Name, // Tham chiếu đến tên hàng đợi ở trên
        "",     // Tên người tiêu thụ, tự động tạo nếu không điền
        true,   // Tự động phê chuẩn cho hàng đợi rằng tin nhắn đã được xử lý
        false,  // Độc quyền
        false,  // Không cục bộ
        false,  // Không chờ
        nil,    // Đối số
    )

    // Lặp qua việc tiêu thụ tin nhắn trong hàng đợi
    for d := range msgs {
        log.Printf("Nhận tin nhắn=%s", d.Body)
    }