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 operatormap,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:
=== 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=2Output 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:
| Komponen | Versi | Tujuan |
|---|---|---|
| Bahasa | Kotlin 2.0.21 | Coroutines native, structured concurrency |
| Async library | kotlinx.coroutines | Standar resmi, dispatchers, Flow |
| Stream | Flow<T> | Cold stream reaktif, backpressure otomatis |
| Concurrency | async/awaitAll, Channel | Paralel dengan structured scope |
| Error handling | supervisorScope + Result<T> | Gagal satu tidak menghentikan lainnya |
| Retry | Custom exponential backoff | Untuk galat sementara (network, DB) |
| Pengujian | kotlin.test + runTest | Test suspend function dengan virtual time |
| Benchmark | Manual measureTimeMillis | Ukur 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, danDispatchers, - Section Coroutines atau Flow: operator
Flow<T>sepertimap,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:
| Bagian | Yang Dikerjakan | Hasil yang Diharapkan |
|---|---|---|
| 1. Desain Pipeline Data | Stage sebagai pure function, kontrak Record -> Record | Stage dapat diuji terpisah; pipeline sequential berjalan |
| 2. Coroutines dan Concurrency | async/awaitAll, Channel, Dispatchers.Default | Pipeline concurrent memproses banyak record paralel |
| 3. Error Handling dan Retry | supervisorScope, Result<T>, exponential backoff | Galat sementara diretry; galat permanen dicatat tanpa menghentikan pipeline |
| 4. Pengujian dan Performa | runTest dengan virtual time, benchmark measureTimeMillis | Test 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 #
- Kotlin coroutines design — dokumentasi desain coroutines Kotlin sebagai rujukan arsitektur pipeline asinkron
- Kotlin documentation home — halaman utama dokumentasi Kotlin sebagai rujukan fitur pendukung proyek
Rancang pipeline data multi-stage dengan pure function: ambil, bersihkan, transformasi, simpan.
Buka → # Bagian 2: Coroutines dan ConcurrencyImplementasi pipeline data asinkron dengan coroutines: fetch paralel, Flow untuk streaming, dan structured concurrency.
Buka → # Bagian 3: Error Handling dan RetryStrategi penanganan error pipeline asinkron: SupervisorJob, Flow.catch, retryWhen, dan pola Result`<T>`.
Buka → # Bagian 4: Pengujian dan PerformaPengujian pipeline asinkron dengan assertion output, dan benchmark List vs Sequence vs Flow untuk 100.000 item.
Buka →