Study
Akka

Akka Streams Dasar (Source/Flow/Sink)

Penjelasan

Akka Streams adalah modul terpisah dari Akka actor untuk memproses aliran data (stream) secara reaktif, dibangun di atas Reactive Streams specification. Tiga komponen dasar Akka Streams: `Source[Out, Mat]` — titik awal aliran data (misal dari list, file, atau socket), `Flow[In, Out, Mat]` — tahap transformasi yang mengubah elemen dari tipe In ke Out (seperti map, filter), dan `Sink[In, Mat]` — titik akhir yang mengonsumsi data (misal mencetak ke console, menyimpan ke file, atau mengumpulkan jadi koleksi). Ketiganya digabungkan lewat operator `.via()` untuk menyambung Flow dan `.to()` atau `.runWith()` untuk menyambung Sink dan menjalankan stream. Menjalankan stream membutuhkan `ActorSystem` implisit (Akka Streams berjalan di atas actor di balik layar) sebagai materializer. Berbeda dari koleksi biasa yang diproses sekaligus di memori, Akka Streams memproses data secara bertahap (elemen demi elemen atau per-chunk), sehingga cocok untuk data besar atau aliran tak terbatas seperti data sensor real-time.

Contoh Konsep

import akka.actor.typed.ActorSystem
import akka.actor.typed.scaladsl.Behaviors
import akka.stream.scaladsl.{Sink, Source}

object ContohStream extends App {
  implicit val system: ActorSystem[Nothing] = ActorSystem(Behaviors.empty, "sistem-stream")
  implicit val ec = system.executionContext

  val source = Source(1 to 10)
  val hasil = source
    .map(n => n * n)          // Flow: kuadratkan tiap elemen
    .filter(_ % 2 == 0)       // Flow: hanya ambil yang genap
    .runWith(Sink.foreach(println)) // Sink: cetak tiap elemen

  hasil.onComplete(_ => system.terminate())(ec)
}

Praktikum

Lengkapi stream yang membaca Source dari daftar nama, mengubah tiap nama jadi huruf besar (Flow), lalu mengumpulkan hasilnya jadi List memakai Sink.seq.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Jangan bingung Akka Streams dengan Akka actor biasa — Streams cocok untuk pipeline transformasi data yang jelas urutannya, sementara actor biasa lebih cocok untuk komunikasi stateful yang tidak selalu berbentuk aliran linear.