Mode topik RabbitMQ Golang mirip dengan mode routing (Direct), dengan perbedaan terbesar yaitu bahwa parameter routing dalam mode topik mendukung pencocokan kabur. Jenis pertukaran untuk mode topik adalah 'topic'.

Arsitektur mode topik adalah sebagai berikut: Mode Topik RabbitMQ

Catatan: Jika Anda tidak familiar dengan mode topik RabbitMQ, silakan baca terlebih dahulu bagian mode topik RabbitMQ.

1. Tutorial Prasyarat

Silakan baca bagian berikut secara berurutan:

Catatan: Karena bagian penerbitan/langganan Golang RabbitMQ sudah berisi contoh kode lengkap, hanya definisi pertukaran dan parameter routing yang berbeda untuk mode RabbitMQ lainnya. Oleh karena itu, hanya kode kunci yang ditunjukkan.

2. Mendeklarasikan Pertukaran Topik

err = ch.ExchangeDeclare(
  "tizi365_topic", // Nama pertukaran, harus unik
  "topic",         // Jenis pertukaran
  true,            // Tahan lama
  false,           // Auto-hapus
  false,           // Internal
  false,           // No-wait
  nil,             // Argumen
)

3. Mengirim Pesan

    // Isi pesan
    body := "Halo Tizi365.com!"

    // Kirim pesan
    err = ch.Publish(
        "tizi365_topic",      // Nama pertukaran
        "www.tizi365.com",    // Parameter routing, parameter penting yang menentukan ke antrian mana pesan Anda akan dikirim
        false,                // Mandatory
        false,                // Immediate
        amqp.Publishing {
            ContentType: "text/plain", // Tipe konten pesan, di sini berupa teks polos
            Body:        []byte(body),  // Isi pesan
        })

4. Mengonsumsi Pesan

4.1. Pemasangan Pertukaran

// Deklarasikan antrian yang akan dioperasikan
    q, err := ch.QueueDeclare(
        "",    // Nama antrian, akan dibuat secara acak jika tidak diisi
        false, // Antrian tahan lama
        false, // Hapus ketika tidak digunakan
        true,  // Eksklusif
        false, // No-wait
        nil,   // Argumen
    )

    // Pasang antrian ke pertukaran yang ditentukan
    err = ch.QueueBind(
        q.Name,             // Nama antrian
        "*.tizi365.com",    // Parameter routing, parameter penting, menggunakan wildcard * untuk mencocokkan satu kata, jika menggunakan #, dapat mencocokkan beberapa kata
        "tizi365_topic",    // Nama pertukaran, harus sesuai dengan pertukaran yang didefinisikan oleh pengirim pesan
        false,
        nil)

4.2. Penanganan Pesan

// Buat konsumer
    msgs, err := ch.Consume(
        q.Name, // Referensi ke nama antrian di atas
        "",     // Nama konsumer, secara otomatis dibuat jika tidak diisi
        true,   // Pengakuan otomatis kepada antrian bahwa pesan telah ditangani
        false,  // Eksklusif
        false,  // No-local
        false,  // No-wait
        nil,    // Argumen
    )

    // Iterasi dalam mengonsumsi pesan dalam antrian
    for d := range msgs {
        log.Printf("Menerima pesan=%s", d.Body)
    }