Di RabbitMQ, ketika sebuah pesan menjadi pesan mati (sebuah pesan yang konsumen tidak dapat proses) di dalam sebuah antrian, pesan tersebut diarahkan ulang ke sebuah pertukaran lain, yang kita sebut pertukaran pesan mati. Pertukaran pesan mati kemudian mengirimkan pesan mati ke sebuah antrian, yang disebut antrian pesan mati.

Ilustrasi Antrian Pesan Mati

Antrian Pesan Mati

Ilustrasi di atas menggambarkan seluruh proses mulai dari pembentukan pesan mati hingga penanganannya.

Pembentukan Pesan Mati

Berikut adalah kondisi-kondisi pembentukan pesan mati:

  • Pesan ditolak secara manual oleh konsumen (basic.reject / basic.nack), dan requeue = false.
  • Waktu hidup pesan (TTL) habis.
  • Antrian mencapai panjang maksimum.

Langkah-langkah Penanganan Antrian Pesan Mati

  1. Tentukan sebuah pertukaran pesan mati (jangan tertipu oleh namanya, ini hanya pertukaran biasa, namanya hanya digunakan dalam konteks penanganan pesan mati).
  2. Tentukan sebuah antrian untuk diikatkan ke pertukaran pesan mati (antrian ini disebut antrian pesan mati, dan juga merupakan antrian biasa).
  3. Tentukan konsumen pesan mati untuk mengonsumsi antrian pesan mati (jangan tertipu oleh namanya, ini juga konsumen biasa).
  4. Ikatkan pertukaran pesan mati ke antrian yang ditentukan (antrian yang perlu menangani pesan mati harus terikat).

Tip: Lihat ilustrasi di atas untuk prinsipnya. Semua bahasa pemrograman menangani antrian pesan mati dengan cara yang mirip.

Penanganan Antrian Pesan Mati di Golang

1. Tentukan Pertukaran Pesan Mati

Tentukan seperti pertukaran biasa.

// Mendeklarasikan pertukaran
err = ch.ExchangeDeclare(
    "tizi365.dead",   // Nama pertukaran
    "topic", // Tipe pertukaran
    true,     // Tahan lama
    false,
    false,
    false,
    nil,
)

2. Tentukan Antrian Pesan Mati

Tentukan seperti antrian biasa.

    // Mendeklarasikan antrian
    q, err := ch.QueueDeclare(
        "",    // Nama antrian, biarkan kosong untuk menghasilkan nama acak
        false, // Antrian tahan lama
        false,
        true,
        false,
        nil,
    )

    // Ikatkan antrian ke pertukaran pesan mati
    err = ch.QueueBind(
        q.Name, // Nama antrian
        "#",     // Kunci routing, # artinya cocokkan semua kunci routing, yang berarti menerima semua pesan pesan mati
        "tizi365.dead", // Nama pertukaran pesan mati
        false,
        nil)

Tip: Perlakukan antrian pesan mati seperti antrian biasa.

3. Tentukan Konsumen Pesan Mati

// Membuat konsumen
msgs, err := ch.Consume(
    q.Name, // Referensikan nama antrian pesan mati sebelumnya
    "",     // Nama konsumen, jika tidak diberikan, akan dihasilkan secara acak
    true,   // Otomatis mengakui pemrosesan pesan
    false, 
    false, 
    false, 
    nil,
)

// Melakukan perulangan untuk mengonsumsi pesan dari antrian pesan mati
for d := range msgs {
    log.Printf("Menerima pesan pesan mati=%s", d.Body)
}

4. Ikatkan Pertukaran Pesan Mati ke Antrian Tertentu

	// Properti antrian
	props := make(map[string]interface{})
	// Ikatkan pertukaran pesan mati
	props["x-dead-letter-exchange"] = "tizi365.dead"
	// Opsional: Tetapkan kunci routing saat pesan mati disampaikan ke pertukaran pesan mati. Jika tidak diatur, kunci routing pesan asli akan digunakan.
	// props["x-dead-letter-routing-key"] = "www.tizi365.com"

	q, err := ch.QueueDeclare(
		"tizi365.demo.hello", // Nama antrian
		true,   // Tahan lama
		false, 
		false, 
		false,   
		props,     // Tetapkan properti antrian
	)

Dengan cara ini, jika pesan-pesan dalam antrian tizi365.demo.hello menjadi pesan mati, mereka akan diteruskan ke pertukaran pesan mati tizi365.dead.