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:
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:
- Bagian konsep dasar RabbitMQ
- Bagian mode topik RabbitMQ
- Bagian Implementasi pola penerbitan/langganan Golang RabbitMQ
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)
}