Setelah membangun aplikasi interaktif (Android), layanan web (Ktor), dan library multiplatform, kita beralih ke kelas aplikasi yang berbeda: Aplikasi Pemrosesan Data Asinkron. Aplikasi ini memproses batch data melalui pipeline multi-stage (ambil, bersihkan, transformasi, simpan) dengan concurrency via coroutines. Pipeline yang sama dapat memproses ribuan record secara paralel, menangani galat dengan retry exponential backoff, dan mengukur performa melalui benchmark. Proyek ini melatih keterampilan penting untuk pekerjaan ETL, data engineering, dan pemrosesan batch. Proyek ini memperkenalkan konsep inti pemrograman asinkron Kotlin: coroutines, dispatchers, structured concurrency, Flow untuk stream data, error handling dengan supervisorScope, retry dengan exponential backoff, dan pengukuran performa. Setiap Bagian menghasilkan pipeline yang dapat dijalankan dan diuji, sehingga kita dapat membandingkan mode sequential, concurrent, dan streaming secara empiris.

Tujuan Proyek #

Aplikasi pemrosesan data asinkron yang akan kita bangun menyediakan:

  • Pipeline multi-stage: ambil → bersihkan → transformasi → simpan.
  • Concurrency dengan coroutines: banyak record diproses paralel via async/awaitAll.
  • Streaming via Flow: record mengalir melalui operator map, filter, catch.
  • Error handling dengan retry dan exponential backoff untuk galat sementara.
  • Pengujian performa dengan benchmark yang mengukur throughput dan latensi.

Setiap stage bersifat pure function yang dapat diuji terpisah. Pipeline menggabungkan stage dengan Flow untuk streaming atau async untuk batch. Mode eksekusi dapat diganti tanpa mengubah kode stage.

Perilaku yang Diharapkan #

Contoh eksekusi pipeline dengan 5 record:

text
=== Sequential ===
  stored:CLEAN-1|step3|id=1
  stored:CLEAN-2|step3|id=2
=== Concurrent (coroutines paralel) ===
  stored:CLEAN-1|step3|id=1
  stored:CLEAN-2|step3|id=2
=== Streaming (Flow) ===
  stored:CLEAN-1|step3|id=1
  stored:CLEAN-2|step3|id=2

Output ketiga pendekatan (sequential, concurrent, streaming) identik untuk pipeline yang sama. Perbedaannya ada di performa: sequential memproses satu record pada satu waktu, concurrent memanfaatkan banyak thread, streaming memproses record saat tersedia (lazy).

Teknologi dan Stack #

Proyek ini menggunakan peranti berikut:

KomponenVersiTujuan
BahasaKotlin 2.0.21Coroutines native, structured concurrency
Async librarykotlinx.coroutinesStandar resmi, dispatchers, Flow
StreamFlow<T>Cold stream reaktif, backpressure otomatis
Concurrencyasync/awaitAll, ChannelParalel dengan structured scope
Error handlingsupervisorScope + Result<T>Gagal satu tidak menghentikan lainnya
RetryCustom exponential backoffUntuk galat sementara (network, DB)
Pengujiankotlin.test + runTestTest suspend function dengan virtual time
BenchmarkManual measureTimeMillisUkur throughput dan latensi

Proyek ini memakai ekosistem kotlinx.coroutines yang menjadi standar untuk pemrograman asinkron Kotlin. Library ini mendukung semua platform (JVM, Android, iOS, JS) dan terintegrasi dengan library populer (Ktor, Room, Retrofit).

Prasyarat #

Pembaca diharapkan telah menyelesaikan chapter berikut:

  • Section Coroutines: suspend, launch, async, runBlocking, dan Dispatchers,
  • Section Coroutines atau Flow: operator Flow<T> seperti map, filter, catch,
  • Section Error Handling: Result<T>, try/catch, dan exception handling,
  • Section Functional Programming: lambda dan higher-order function,
  • Pengujian dengan kotlin.test (proyek Aplikasi Inventaris).

Karena kode contoh memakai kotlinx.coroutines, kompilasi membutuhkan classpath library. Perintah di setiap Bagian menunjukkan cara kompilasi dan eksekusi.

Arsitektur #

Pipeline dirancang sebagai rangkaian stage yang dapat dikomposisi. Setiap stage adalah fungsi Record -> Record (pure function). Stage dapat dirangkai dengan map (sequential), async (concurrent), atau operator Flow (streaming). Pemisahan stage dari cara eksekusi membuat pipeline dapat dijalankan dalam berbagai mode tanpa mengubah kode stage.

Stage berdiri sebagai pure function tanpa efek samping, sehingga dapat diuji terpisah dari pipeline. Lapisan eksekusi (sequential, concurrent, streaming) mengomposisikan stage sesuai kebutuhan throughput dan latensi. Lapisan retry membungkus stage yang berisiko mengalami galat sementara, sementara supervisorScope memastikan kegagalan satu record tidak menghentikan record lain yang sedang diproses paralel.

Struktur Bagian #

Proyek ini dikerjakan dalam empat bagian berurutan:

BagianYang DikerjakanHasil yang Diharapkan
1. Desain Pipeline DataStage sebagai pure function, kontrak Record -> RecordStage dapat diuji terpisah; pipeline sequential berjalan
2. Coroutines dan Concurrencyasync/awaitAll, Channel, Dispatchers.DefaultPipeline concurrent memproses banyak record paralel
3. Error Handling dan RetrysupervisorScope, Result<T>, exponential backoffGalat sementara diretry; galat permanen dicatat tanpa menghentikan pipeline
4. Pengujian dan PerformarunTest dengan virtual time, benchmark measureTimeMillisTest deterministic; benchmark membandingkan throughput tiga mode

Mulailah dari Bagian 1 dan ikuti urutannya karena setiap Bagian dibangun di atas Bagian sebelumnya. Setelah Bagian 4 selesai, kita telah menyelesaikan sembilan proyek end-to-end yang membentang dari CLI sederhana hingga pipeline data asinkron, dan siap menjelajah topik lanjutan melalui section Sumber Belajar.

Referensi Lanjutan #