Bukan Sekadar Menunggu: Panduan Praktis Sistem Antrean (Queue) dengan Hono dan Redis

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
Search for a command to run...

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
No comments yet. Be the first to comment.
Ringkasan: Jika OpenClaw adalah AI Operating System yang menghubungkan berbagai layanan dan agent, maka Hermes adalah AI Worker yang fokus mengerjakan pekerjaan, belajar dari pengalaman, dan semakin p

Ketika membangun aplikasi modern seperti Next.js, Cloudflare Workers, platform AI, microservices, atau real-time dashboard, ada banyak istilah jaringan yang sering muncul: TCP, UDP, HTTP/2, QUIC, WebS

Setiap tahun, ribuan mahasiswa jurusan Teknologi Informasi, Sistem Informasi, dan Teknik Informatika diwisuda. Namun, tidak sedikit di antara mereka yang kemudian menghadapi kenyataan yang cukup berat

Jika Anda menggunakan Next.js, kemungkinan besar Anda pernah mendengar anggapan bahwa: "Next.js = Vercel" Padahal kenyataannya tidak harus demikian. Di sinilah OpenNext hadir. OpenNext adalah proyek

Saat pertama kali mencoba OpenCode Go, saya hampir langsung berlangganan tanpa membaca detail program yang mereka sediakan. Untungnya saya menemukan bahwa OpenCode memiliki program referral yang membe

Dalam pengembangan aplikasi modern, responsivitas adalah segalanya. Namun, seringkali kita dihadapkan pada tugas-tugas yang memakan waktu: memproses video, membuat laporan, atau mengirim ribuan email. Jika kita mengerjakannya secara langsung, pengguna akan terjebak menatap layar loading.
Solusinya bukan await yang lebih lama, melainkan mengubah cara kita berpikir tentang tugas. Inilah panduan praktis untuk memahami dan mengimplementasikan sistem antrean (queue), sebuah pola arsitektur yang memisahkan "permintaan" dari "pekerjaan" menggunakan Hono sebagai pemicu dan Redis sebagai tulang punggungnya.
Bayangkan Anda adalah barista di kedai kopi yang sibuk.
Producer (Kasir): Pelanggan (pengguna) datang dan memesan kopi. Kasir (aplikasi Hono Anda) menerima pesanan, menuliskannya di secangkir kertas, dan menaruhnya di antrean di sebelah mesin espresso. Tugas kasir selesai dengan cepat, dan ia bisa melayani pelanggan berikutnya.
Queue (Antrean Cangkir): Ini adalah Redis. Sebuah tempat penampungan pesanan yang bekerja berdasarkan prinsip FIFO (First-In, First-Out). Pesanan pertama yang masuk, yang pertama akan dibuat.
Consumer (Barista): Ini adalah proses Worker Anda yang berjalan terpisah. Barista (worker) mengambil satu per satu cangkir dari antrean, membuat kopinya (melakukan tugas berat), lalu menyajikannya.
Dengan sistem ini, kasir tidak pernah terblokir menunggu kopi selesai dibuat. Inilah inti dari pekerjaan asinkron dan decoupling.
Gunakan sistem antrean ketika sebuah tugas bersifat:
Lambat (Slow): Proses yang memakan waktu lebih dari beberapa detik.
Berat (Resource-Intensive): Proses yang memakan banyak CPU atau Memori, yang jika dijalankan langsung akan mengganggu performa server utama.
Banyak (Bulk): Tugas yang perlu dilakukan dalam jumlah besar.
Mari kita buat contoh nyata. Kita akan menggunakan BullMQ, sebuah library antrean yang kuat dan populer untuk lingkungan Node.js/Bun yang menggunakan Redis sebagai backend.
Pastikan Anda memiliki Redis yang sedang berjalan (bisa melalui Docker, atau layanan gratis seperti Upstash).
Bash
# Inisialisasi proyek dan install dependencies
bun init -y
bun add hono bullmq
Ini adalah server HTTP yang menerima permintaan dari pengguna dan menambahkannya ke antrean. Buat file index.ts.
TypeScript
// index.ts
import { Hono } from 'hono'
import { Queue } from 'bullmq'
// 1. Koneksi ke Redis sebagai message broker
const redisConnection = {
host: '127.0.0.1', // Ganti dengan host Redis Anda
port: 6379,
}
// 2. Buat instance Queue bernama 'email-queue'
const emailQueue = new Queue('email-queue', { connection: redisConnection })
const app = new Hono()
// 3. Endpoint untuk memicu pengiriman email
app.post('/send-welcome-email', async (c) => {
const { email, name } = await c.req.json()
if (!email || !name) {
return c.json({ error: 'Email and name are required' }, 400)
}
// 4. Tambahkan tugas ke antrean dengan data yang relevan
// Tugas ini akan diambil oleh Worker nanti
const job = await emailQueue.add('send-email-job', { email, name })
console.log(`Tugas ${job.id} untuk mengirim email ke ${email} telah ditambahkan ke antrean.`)
// 5. Langsung beri respons ke pengguna, jangan tunggu email terkirim!
return c.json({
message: 'Welcome! We are preparing your welcome email.',
jobId: job.id,
})
})
export default {
port: 3000,
fetch: app.fetch,
}
Ini adalah proses yang berjalan di latar belakang untuk mengerjakan tugas. Buat file worker.ts.
TypeScript
// worker.ts
import { Worker } from 'bullmq'
const redisConnection = {
host: '127.0.0.1', // Pastikan ini sama dengan di Producer
port: 6379,
}
console.log('Worker sedang berjalan, menunggu tugas...')
// 1. Buat Worker yang "mendengarkan" antrean 'email-queue'
const worker = new Worker('email-queue', async (job) => {
const { email, name } = job.data
console.log(`[START] Memproses tugas ${job.id}: Mengirim email ke ${email}`)
// 2. Simulasi pekerjaan berat (misalnya, koneksi ke SMTP server)
// Di dunia nyata, di sinilah Anda akan menggunakan library seperti Nodemailer
await new Promise(resolve => setTimeout(resolve, 5000)) // Tunggu 5 detik
console.log(`[DONE] Tugas ${job.id}: Email selamat datang berhasil dikirim ke ${name} (${email})`)
return { status: 'completed' }
},
{ connection: redisConnection }
)
worker.on('failed', (job, err) => {
console.error(`Tugas ${job?.id} gagal dengan error: ${err.message}`)
})
Anda perlu menjalankan dua proses ini secara terpisah di terminal yang berbeda.
Terminal 1 (Menjalankan Server Hono):
Bash
bun run index.ts
Terminal 2 (Menjalankan Worker):
Bash
bun run worker.ts
Sekarang, coba kirim permintaan POST ke http://localhost:3000/send-welcome-email dengan body JSON {"email": "test@example.com", "name": "Budi"}. Anda akan langsung mendapatkan respons, dan 5 detik kemudian, Anda akan melihat log "Email berhasil dikirim" di terminal worker.
Broker (Redis): Anda tidak bisa menjalankan Redis di platform serverless. Anda harus menggunakan layanan terkelola seperti Upstash yang menyediakan URL koneksi Redis.
Consumer (Worker): Platform serverless memiliki batas waktu eksekusi. Ini cocok untuk tugas antrean yang cepat (misalnya, beberapa detik), tetapi tidak untuk proses yang memakan waktu berjam-jam. Untuk tugas yang sangat lama, worker Anda sebaiknya dijalankan di lingkungan yang persisten seperti VM (EC2/DigitalOcean) atau kontainer (Fargate/Cloud Run).