Membangun aplikasi yang hidup: WebSocket untuk chat & live leaderboard, streaming video dengan HLS & WebRTC, dan praktik fitur kelas live Fitku yang selalu terhubung

Setelah di episode 21 kita menghadirkan AI coach yang berdialog dengan pengguna, kali ini kita naik satu level: membuat aplikasi yang selalu terhubung. Episode 22 ini membahas real-time & streaming apps — WebSocket untuk chat dan live data, serta streaming video (HLS & WebRTC). Studi kasus Fitku kali ini mendapat fitur kelas live: instruktur mengalirkan video, sementara peserta melihat detak jantung dan leaderboard langkah secara langsung.
Mengapa ini penting? Di 2026 pengguna tidak rela menekan refresh. Fitur seperti chat, notifikasi live, streaming workout, dan leaderboard waktu nyata adalah pembeda antara aplikasi "biasa" dan aplikasi yang terasa hidup — sekaligus fondasi sebelum kita membahas sinkronisasi offline di episode 23.
HTTP adalah protokol request-response: klien bertanya, server menjawab, lalu koneksi selesai. Kalau ingin data terbaru, klien harus bertanya lagi (polling). WebSocket adalah koneksi full-duplex yang tetap terbuka: server bisa mengirim data kapan saja tanpa ditanya.
| Aspek | HTTP (polling) | WebSocket |
|---|---|---|
| Arah komunikasi | Request-response | Full-duplex, dua arah |
| Latensi data baru | Tergantung interval polling | Instan |
| Overhead koneksi | Koneksi baru per request | Satu koneksi panjang |
| Kapan cocok | Data yang jarang berubah | Data yang terus berubah |
Koneksi WebSocket dimulai sebagai HTTP, lalu di-upgrade lewat handshake Upgrade: websocket. URL-nya memakai ws:// untuk plain dan wss:// untuk TLS (wajib di production, seperti https).
Note
Sebelum memilih WebSocket, tanyakan: apakah data memang berubah dalam hitungan detik? Untuk angka statistik yang cukup diperbarui tiap 30 detik, polling periodik lebih sederhana dan lebih hemat baterai. WebSocket untuk hal yang tidak perlu realtime sama saja dengan membuang resource.
Kasus paling klasik adalah chat, dan di Fitku kita pakai untuk live leaderboard workout komunitas: setiap kali anggota menyelesaikan satu set, server menyiarkan angka barunya ke semua peserta.
val client = OkHttpClient()
val request = Request.Builder()
.url("wss://fitku.dev/ws/leaderboard?room=run-07")
.build()
val listener = object : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
// {"type":"step_update","userId":42,"steps":9842}
viewModel.updateLeaderboard(parseJson(text))
}
override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {
scheduleReconnect() // koneksi terputus bersih
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
scheduleReconnect() // koneksi gagal (network drop)
}
}
val ws = client.newWebSocket(request, listener)Jaringan ponsel tidak stabil — koneksi akan putus. Jangan langsung sambung ulang; naikkan jeda secara eksponensial agar tidak membebani server saat banyak pengguna putus bersamaan:
percobaan ke-1 → tunggu 1 detik
percobaan ke-2 → tunggu 2 detik
percobaan ke-3 → tunggu 4 detik
percobaan ke-4 → tunggu 8 detik
... → cap maksimal 60 detikTambahkan juga heartbeat (ping/pong) agar koneksi mati-senyap terdeteksi cepat, dan reset counter backoff setelah koneksi berhasil bertahan beberapa saat.
WebSocket hanyalah "pipa". Di baliknya ada server yang memastikan pesan sampai ke semua peserta yang relevan:
Pola ini (gateway + pub/sub) memisahkan urusan koneksi dari urusan logika bisnis, sehingga menambah fitur realtime baru tidak mengganggu yang lama.
Untuk video, ada dua kategori kebutuhan dengan teknologi berbeda:
ExoPlayer/AVPlayer, dan latensinya biasanya 6-30 detik — masih ok untuk kelas yang hanya menonton.Peserta menonton instruktur → HLS (ExoPlayer/AVPlayer)
Peserta bicara dengan trainer → WebRTC (SFU: LiveKit, mediasoup, dll.)
Rekaman kelas → HLS (vod, offload ke CDN)Important
Streaming video di ponsel = data & baterai. Jangan auto-play bitrate tertinggi; pilih kualitas berdasarkan jenis koneksi, berhenti streaming saat layar mati, dan selalu sediakan fallback (audio-only atau replay). Pengguna dengan kuota terbatas akan menghargai ini.
Alur implementasinya:
wss://fitku.dev/ws/live.wss:// wajib, validasi token di gateway (episode 13), dan jangan pernah menaruh key di klien.Tip
Prinsip desain realtime: tampilkan data terakhir yang diketahui secepat mungkin, lalu perbaiki saat data baru tiba. UI yang responsif lebih penting daripada data yang sempurna sedetik lebih cepat. Kombinasikan WebSocket dengan state management episode 9 dan storage lokal episode 11 agar pengalaman tetap mulus saat jaringan buruk.
Pada episode 22 ini, kalian telah membangun aplikasi realtime:
Tapi apa jadinya ketika pengguna Fitku lari di area tanpa sinyal sama sekali? Di episode 23 selanjutnya kita jawab dengan Offline-First & Sync Architecture — optimistic updates, conflict resolution, dan background sync. Sampai jumpa!