Mode Kerja RabbitMQ Golang, Mencapai Konsumsi Bersama oleh Beberapa Konsumen secara Bersamaan.

Golang work queue

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.