Recraftory

Producer dan Consumer

Memahami peran producer dan consumer dalam message queue

Producer

  • Aplikasi atau service yang mengirim pesan ke queue
  • Bertanggung jawab memformat pesan dengan benar
  • Tidak perlu tahu siapa yang akan memproses pesan

Tugas Producer

  • Membuat pesan dengan format yang konsisten
  • Mengirim pesan ke queue atau exchange
  • Menangani kegagalan pengiriman pesan
  • Menyimpan referensi pesan jika perlu tracking

Contoh Producer

async function kirimPesanan(pesanan) {
  const pesan = {
    id: pesanan.id,
    userId: pesanan.userId,
    items: pesanan.items,
    total: pesanan.total,
    waktu: new Date().toISOString()
  };

  await queue.send('order_queue', JSON.stringify(pesan));
  return { status: 'pending', orderId: pesanan.id };
}

Consumer

  • Aplikasi atau service yang membaca dan memproses pesan dari queue
  • Bisa berjalan sebagai worker terpisah dari aplikasi utama
  • Bisa ada banyak instance consumer untuk parallelism

Tugas Consumer

  • Membaca pesan dari queue
  • Memproses pesan sesuai business logic
  • Mengonfirmasi pesan berhasil diproses (acknowledge)
  • Menangani error dan retry

Contoh Consumer

async function prosesPesanan() {
  const pesan = await queue.receive('order_queue');
  
  try {
    const pesanan = JSON.parse(pesan.body);
    await prosesPembayaran(pesanan);
    await updateStatusPesanan(pesanan.id, 'dibayar');
    await queue.acknowledge(pesan);
  } catch (error) {
    await queue.retry(pesan);
  }
}

Acknowledge (Ack)

  • Signal ke queue bahwa pesan berhasil diproses
  • Queue menghapus pesan setelah di-acknowledge
  • Tanpa acknowledge, pesan tetap di queue dan bisa diproses ulang

Durability

Durable Queue

  • Queue tetap ada meski broker restart
  • Pesan tidak hilang saat ada gangguan
  • Direkomendasikan untuk data penting

Non-Durable Queue

  • Queue hilang saat broker restart
  • Pesan bisa hilang
  • Cocok untuk data sementara atau real-time

Message Persistence

Persistent Message

  • Pesan disimpan ke disk, tidak hilang saat restart
  • Lebih lambat tapi lebih aman
  • Gunakan untuk pesan yang tidak boleh hilang

Non-Persistent Message

  • Pesan hanya di memory
  • Lebih cepat tapi hilang saat restart
  • Cocok untuk notifikasi real-time

Consumer Group

  • Beberapa consumer membaca dari queue yang sama
  • Pesan didistribusikan ke consumer yang tersedia
  • Load balancing otomatis antar consumer
  • Jika satu consumer mati, pesan dialihkan ke consumer lain

Praktik Terbaik

  • Producer harus menangani failure saat queue tidak tersedia
  • Consumer harus idempoten, aman diproses berulang kali
  • Gunakan acknowledge manual untuk memastikan pesan selesai diproses
  • Monitor consumer lag untuk deteksi bottleneck
  • Scale consumer sesuai dengan jumlah pesan di queue