Backpressure di Akka Streams
Penjelasan
Backpressure adalah salah satu alasan utama Akka Streams dibangun di atas Reactive Streams specification. Masalah klasik dalam pemrosesan stream adalah ketika Source menghasilkan data lebih cepat daripada Sink bisa mengonsumsinya — tanpa mekanisme kontrol, ini bisa menyebabkan buffer membengkak tak terbatas hingga aplikasi kehabisan memori (OutOfMemoryError). Akka Streams mengatasi ini secara otomatis: setiap tahap (Source, Flow, Sink) berkomunikasi lewat sinyal permintaan (demand) — consumer hanya meminta sejumlah elemen yang sanggup ia proses, dan producer hanya mengirim elemen sebanyak yang diminta. Ini disebut pull-based backpressure, kebalikan dari model push biasa yang bisa membanjiri consumer. Selain mekanisme otomatis ini, developer bisa mengatur strategi eksplisit lewat `.buffer(size, overflowStrategy)` untuk menentukan apa yang terjadi saat buffer penuh — misalnya `OverflowStrategy.dropHead` (buang elemen terlama), `dropNew` (buang elemen baru), atau `backpressure` (tahan producer sampai ada ruang). Memahami backpressure penting terutama saat mengintegrasikan Akka Streams dengan sumber eksternal seperti database atau API yang punya rate limit.
Contoh Konsep
import akka.actor.typed.ActorSystem
import akka.actor.typed.scaladsl.Behaviors
import akka.stream.OverflowStrategy
import akka.stream.scaladsl.{Sink, Source}
import scala.concurrent.duration._
object ContohBackpressure extends App {
implicit val system: ActorSystem[Nothing] = ActorSystem(Behaviors.empty, "sistem-backpressure")
Source(1 to 1000)
.buffer(10, OverflowStrategy.dropHead) // buffer terbatas, buang elemen terlama jika penuh
.throttle(1, 100.millis) // simulasi consumer lambat
.runWith(Sink.foreach(println))
}
Praktikum
Lengkapi stream angka 1 sampai 500 yang memakai buffer berukuran 20 dengan strategi backpressure (menahan producer, bukan membuang data), lalu dijalankan ke Sink.foreach untuk mencetak tiap angka.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Pilih overflow strategy sesuai kebutuhan bisnis: dropHead/dropNew cocok untuk data real-time yang boleh kehilangan sebagian (misal metrik monitoring), sementara backpressure murni wajib dipakai kalau setiap elemen data penting dan tidak boleh hilang, seperti transaksi keuangan.