Saatnya menulis kode pertama dengan RabbitMQ. Di episode ini kalian membuat producer dan consumer sederhana memakai Python pika, Node.js amqplib, dan Go amqp091-go, lalu mempelajari best practices pengelolaan connection, channel, heartbeat, dan graceful shutdown.

Inilah momen paling membahagiakan dalam series ini: kalian akan menulis program pertama yang benar-benar berkomunikasi lewat RabbitMQ. Kita mulai dari pola paling sederhana — satu producer mengirim pesan "Hello World" ke queue, dan satu consumer menampilkannya.
Meskipun sederhana, episode ini memuat fondasi penting yang tidak akan berubah sepanjang karier kalian: cara membuka koneksi, cara membuat channel, cara mempublikasikan pesan, dan cara memproses pesan masuk. Kesalahan pengelolaan connection dan channel di tahap ini akan menjadi masalah serius di produksi.
Kami menunjukkan implementasi di tiga bahasa yang paling populer — Python dengan pika, Node.js dengan amqplib, dan Go dengan amqp091-go. Pilih satu bahasa yang paling nyaman, tapi coba pahami pola umumnya: mereka semua berbagi alur yang identik.
Install library client di bahasa pilihan kalian. Untuk Python:
pip install pikaLalu tulis producer. Producer membuka koneksi, membuat channel, mendeklarasikan queue, dan mem-publish pesan:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel = connection.channel()
channel.queue_declare(queue="hello")
channel.basic_publish(exchange="", routing_key="hello", body=b"Hello World")
print("pesan terkirim")
connection.close()Perhatikan bahwa routing_key di sini berperan sebagai nama queue, karena kita memakai default exchange (exchange kosong). Detail exchange akan dibahas di episode 6.
Consumer menggunakan callback yang dipanggil setiap kali pesan tiba:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel = connection.channel()
channel.queue_declare(queue="hello")
def callback(ch, method, properties, body):
print(f"menerima: {body}")
channel.basic_consume(queue="hello", on_message_callback=callback, auto_ack=True)
print("menunggu pesan...")
channel.start_consuming()Fungsi channel.start_consuming memblokir program dan terus mendengarkan pesan. auto_ack=True memberitahu broker bahwa pesan langsung dianggap terproses tanpa ack manual.
Untuk Node.js, install amqplib lalu tulis producer:
npm install amqplibconst amqp = require("amqplib");
async function main() {
const conn = await amqp.connect("amqp://localhost");
const ch = await conn.createChannel();
await ch.assertQueue("hello");
ch.sendToQueue("hello", Buffer.from("Hello World"));
console.log("pesan terkirim");
await conn.close();
}
main();amqp.connect mengembalikan promise, dan assertQueue mendeklarasikan queue jika belum ada. Di Node.js, pola async di atas akan kita perbaiki dengan connection recovery di episode 28.
Untuk Go, install package resmi amqp091-go:
go get github.com/rabbitmq/amqp091-gopackage main
import (
"log"
amqp "github.com/rabbitmq/amqp091-go"
)
func main() {
conn, err := amqp.Dial("amqp://localhost")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatal(err)
}
defer ch.Close()
err = ch.Publish("", "hello", false, false, amqp.Publishing{Body: []byte("Hello World")})
if err != nil {
log.Fatal(err)
}
log.Println("pesan terkirim")
}Perhatikan bahwa Publish di Go tidak mendeklarasikan queue otomatis — deklarasi harus dilakukan eksplisit. Ini pengingat bahwa deklarasi queue adalah tanggung jawab aplikasi, bukan broker.
Satu hal yang wajib diingat: connection adalah sumber daya mahal, channel adalah sumber daya murah. Sebuah aplikasi sebaiknya memakai satu atau beberapa koneksi yang dibagi, dan membuat channel baru untuk setiap task bersamaan. Di Python, jika kalian memakai BlockingConnection di banyak thread, buat satu connection per thread. Di Node.js dan Go, satu connection bisa dipakai concurrency karena channel-nya thread-safe.
Setiap koneksi harus mengatur heartbeat — ping berkala agar broker tahu client masih hidup. Default heartbeat RabbitMQ adalah 60 detik. Jika client terlalu lama tidak mengirim data, broker akan memutus koneksi yang dianggap mati.
Untuk graceful shutdown, consumer harus berhenti memproses pesan baru, lalu menutup channel dan connection dalam urutan yang benar:
channel.stop_consuming()
channel.close()
connection.close()Perintah connection.close() harus dipanggil setelah semua channel ditutup, agar broker melepas resource dengan bersih.
Warning
Jangan pernah menutup connection di dalam callback consumer tanpa menangani kasus pesan yang sedang diproses. Pesan bisa hilang atau ter-ack dua kali. Selalu pikirkan urutan shutdown di episode 5 saat kita membahas acknowledgment.
Di episode 4 ini kalian sudah menulis producer dan consumer pertama di Python, Node.js, dan Go; memahami alur connection-channel-publish-consume; serta belajar praktik terbaik pengelolaan koneksi, heartbeat, dan shutdown yang bersih.
Inti yang harus dibawa pulang:
auto_ack=True mempermudah demo, tapi berbahaya untuk produksi.Di episode 5 selanjutnya kita akan membangun work queues — mendistribusikan task berat ke banyak worker dengan round-robin, memakai manual acknowledgment agar pesan tidak hilang saat worker crash, dan mengatur prefetch dengan QoS agar setiap worker bekerja sesuai kapasitasnya. Konsep ini adalah fondasi dari semua sistem task processing di dunia nyata!