Akka stream adalah library untuk streaming processing yang dibangun di atas Akka, memungkinkan developer menghandle data secara streaming, dengan resiko out-of-memory sekecil mungkin menggunakan mekanisme backpressure. Akka Stream juga menawarkan API yang beragam, memungkinkan developer melakukan transformasi elemen, melakukan operasi yang bergantung dengan waktu, dan lain-lain namun tetap type-safe. Akka Stream sebagai salah satu alternatif streaming processing library di Scala, maupun di JVM.

Nah, Akka Stream memiliki 3 konsep API utama, diantaranya adalah :

  • Source

Entry Point pemrosesan data di Akka Stream – kita dapat membuat turunan suatu kelas ini dari berbagai sumber; misalnya, kita dapat menggunakan single method () jika kita ingin membuat Sumber dari String tunggal, atau kita dapat membuat Sumber dari elemen Iterable.

  • Flow

Blok pemrosesan utama – setiap  instance Flow memiliki satu input dari Source dan satu nilai output untuk dialirkan ke Sink. Pada tahap ini bisa dilakukan  beberapa pemrosesan data misalnya parsing atau cleansing.

  • Sink

Tujuan akhir elemen data setelah diproses – Sink menghasilkan output dari keseluruhan proses yang sudah berjalan pada dari tahap Source ke Flow.

Rangkaian Source, Flow dan Sink dapat diibaratkan seperti pipa yang akan mengalirkan data. Untuk mengakses suatu resource data, rangkaian ini memerlukan RunnableGraph[M] dengan memanggil metode .run() pada RunnableGraph data mulai mengalir dan diproses.

Baca Juga: Berkenalan Dengan Scala Untuk Big Data

Lalu Bagaimana contoh penggunaan rangkaian ini ?

Di bawah ini adalah contoh RunnableGraph yang menerima input list integer 0 sampai 10, menambahkan tiap angka dengan 5, dan menjumlahkan semua angka tersebut sebagai hasil akhir.

Source(0 to 10).map(_ + 5).to(Sink.fold(0)(_ + _)).run()

Dalam terminologi Akka Stream, proses pengaktifan rangkaian ini disebut sebagai stream materialization. Proses materialisasi ini akan menyebabkan operator-operator di dalam RunnableGraph bekerja untuk setiap elemen yang lewat dan ketika operasi eksekusi elemen-elemen yang lewat teresebut sukses, sebuah nilai akhir yang type nya sama dengan type parameter RunnableGraph terkait dihasilkan jika stream sukses, atau exception jika stream mengalami kegagalan.

Bagaimana mekanisme Error Handling di Akka Stream ?

Akka Stream membagi 2 semantik kesalahan yang mungkin muncul selama keberlangsungan proses: error dan failure. Contoh failure adalah habisnya sumber daya mesin, rusaknya hardware, dan lain-lain. Untuk error, salah satu contohnya adalah kesalahan input, ketiadaan file dengan nama tertentu, dan lain-lain. Kejadian munculnya failure bisa jadi mengurangi sebagian atau keseluruan kapabilitas layanan, akan tetapi kemunculan error tidak boleh mengurangi kemampuan layanan.

Berdasarkan hal ini, Akka Stream memberikan perlakukan yang berbeda antara error dan failure. Error dianggap sebagai layaknya elemen biasa pada stream, sedangkan failure akan menyebabkan stream berhenti dan dihancurkan oleh materializer tanpa menghasilkan nilai materialisasi. Berhentinya stream karena failure merupakan hal yang tidak diinginkan, oleh karena itu Akka Stream memiliki seperangkat API yang memungkinkan developer mengubah failure pada salah satu atau beberapa stage di stream menjadi elemen biasa atau mengabaikan failure tersebut agak stream tetap berjalan normal.

Lalu, seperti apa karakteristik Akka Stream ?

Back-pressure

Mekanisme kontrol aliran elemen pada stream yang memungkinkan sisi hulu memperlambat laju produksi elemen ketika sisi hilir mengalami perlambatan dalam mengonsumsi elemen yang datang. Keberadaan mekanisme back-pressure ini yang memungkinkan Akka Stream ramah memori walaupun dengan cara mengorbankan througput sistem.

Non-blocking

Operator pada stream tidak menghalangi keberjalanan thread pemanggil.

Composable

Di bagian awal sempat disebutkan bahwa menyusun RunnableGraph bisa dianggap seperti menyusun pipa air. Ini dapat diterjemahkan bahwa Source, Sink, maupun Flow dapat disusun untuk membuat Source, Sink, dan Flow baru.

Referensi :

https://doc.akka.io/docs/akka/current/stream/index.html

https://www.lightbend.com/blog/use-akka-streams-dynamically-controlled-streams

https://www.baeldung.com/akka-streams

https://medium.com/pujanggateknologi/berkenalan-dengan-akka-stream-820ed1a1ecfc