Pukul 2 pagi. Halaman dasbor PagerDuty menyala merah menyala, menerangi wajah lelah tim SRE kami. Antrean pesan di sistem kami meluber hingga puluhan juta event setelah kampanye kilat salah satu klien enterprise meledak di luar ekspektasi. Saat itu, perdebatan sengit antara murni mengandalkan ketangguhan Apache Kafka sebagai pusat saraf event streaming versus kehandalan kustomisasi tingkat rendah dari Go Workers untuk memproses payload secara paralel mencapai puncaknya. Kami tidak sedang berteori di ruang kuliah; kami sedang menyelamatkan latensi sistem dari jurang kehancuran total.
| Hero Comparison Matrix | Apache Kafka | Go Workers |
|---|---|---|
| Kecepatan (Throughput) | 9/10 | 8/10 |
| Latency | 8/10 | 9/10 |
| RAM Footprint | 6/10 | 9/10 |
| Setup & Maintenance | 5/10 | 8/10 |
| Ekosistem | 9/10 | 8/10 |
[!IMPORTANT] Memilih arsitektur event-driven skala besar bukan soal mencari teknologi paling populer di Hacker News, melainkan memahami batasan I/O, batas memori worker, dan jaminan pengiriman data (at-least-once delivery) saat jaringan mendadak fluktuatif.
1. Pertarungan Filosofi: Dua Cara Pandang Berbeda dalam Memecahkan Masalah
Ketika kita berbicara tentang arsitektur skala besar, seringkali perdebatan bermuara pada dua kubu: mereka yang melihat data sebagai aliran log yang tidak pernah berubah (log-centric), dan mereka yang melihat data sebagai antrean tugas yang harus segera diselesaikan dan dihapus dari memori (task-queue).
Apache Kafka memandang dunia sebagai sebuah append-only commit log. Tidak ada konsep "pesan hilang setelah dibaca". Seluruh state disimpan secara terstruktur di disk, memanfaatkan kemampuan page cache Linux secara agresif, dan menyerahkan urusan konsumsi data kepada klien melalui mekanisme consumer group. Di sisi lain, Go Workers adalah perwujudan dari efisiensi konkuren. Golang hadir dengan konkurensi tingkat tinggi berbasis goroutine dan channel, memungkinkan kita membangun unit pekerja yang lincah, menyedot tugas dari memori, dan mengeksekusinya tanpa overhead JVM atau manajemen memori yang rumit.
[!TIP] Jangan pernah mencoba memperlakukan Kafka seperti database transaksional. Ia adalah pipa ledeng berkecepatan tinggi; biarkan Go Workers yang bertindak sebagai pemroses akhir di ujung pipa tersebut.
Transisi mulus dari filosofi abstrak ini membawa kita langsung ke atas meja kerja, di mana baris-baris kode pertama kali ditulis dan diuji di bawah tekanan deadline proyek.
2. Ronde 1: Ergonomi Menulis Kode & Pengalaman Konfigurasi Sehari-hari
Menulis konfigurasi dan kode untuk menyambungkan kedua ekosistem ini menuntut ketelitian tingkat tinggi. Mari kita lihat bagaimana Apache Kafka dan Go Workers saling melengkapi dalam skrip nyata.
Pertama, kita siapkan struktur konsumen di Go menggunakan pustaka segmentio/kafka-go atau confluent-kafka-go. Di sinilah ergonomi Go benar-benar diuji:
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"github.com/segmentio/kafka-go"
)
func main() {
// Konfigurasi Consumer Group untuk memastikan skalabilitas horizontal
r := kafka.NewReader(kafka.ReaderConfig{
Brokers: []string{"localhost:9092\