Mode Kerja RabbitMQ Golang, Mencapai Konsumsi Bersama oleh Beberapa Konsumen secara Bersamaan.
Penjelasan: P mewakili produsen, C1 dan C2 mewakili konsumen, dan warna merah mewakili antrian.
Tip: Setiap pesan hanya dapat dikonsumsi oleh satu konsumen.
Pra-tutorial
Silakan baca Panduan Memulai Cepat RabbitMQ Golang terlebih dahulu untuk memahami operasi dasar Golang pada RabbitMQ. Jika Anda tidak familiar dengan RabbitMQ, silakan baca bab-bab sebelumnya terlebih dahulu.
Konsumsi Bersama
Golang terutama menggunakan goroutine untuk mengimplementasikan beberapa konsumen, di bawah ini adalah implementasi dari beberapa konsumen.
Tip: Untuk cara mengirim pesan, silakan lihat Panduan Memulai Cepat RabbitMQ Golang.
package main
import (
"log"
"time"
"github.com/streadway/amqp"
)
// Penanganan kesalahan
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
// Terhubung ke RabbitMQ
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "Gagal terhubung ke RabbitMQ")
defer conn.Close()
// Membuat 5 konsumen melalui goroutine
for i := 0; i < 5; i++ {
go func(number int) {
// Membuat saluran rabbitmq untuk setiap konsumen
ch, err := conn.Channel()
failOnError(err, "Gagal membuka saluran")
defer ch.Close()
// Mendeklarasikan antrian yang akan dioperasikan
q, err := ch.QueueDeclare(
"hello", // Nama antrian
false, // Durable
false, // Hapus saat tidak digunakan
false, // Eksklusif
false, // No-wait
nil, // Argumen
)
failOnError(err, "Gagal mendeklarasikan antrian")
// Membuat konsumen
msgs, err := ch.Consume(
q.Name, // Nama antrian yang akan dioperasikan
"", // ID unik konsumen, jika tidak diisi, nilai unik akan dibuat secara otomatis
true, // Otokonfirmasi pesan (yaitu secara otomatis mengonfirmasi bahwa pesan telah diproses)
false, // Eksklusif
false, // Tidak lokal
false, // No-wait
nil, // Args
)
failOnError(err, "Gagal mendaftarkan konsumen")
// Proses pesan dalam sebuah loop
for d := range msgs {
log.Printf("[Nomor Konsumen=%d] Menerima pesan: %s", number, d.Body)
// Simulasi pemrosesan bisnis, tidur selama 1 detik
time.Sleep(time.Second)
}
}(i)
}
// Gantung goroutine utama untuk mencegah program keluar
terusMenerus := make(chan bool)
<-terusMenerus
}
Tip: Terlepas dari jenis pertukaran yang digunakan oleh RabbitMQ, antrian dapat memiliki beberapa konsumen, dan cara memulai beberapa konsumen sama dengan contoh ini.