- Aplikasi local-first menjanjikan respons yang cepat dan jaminan privasi dasar, tetapi memiliki keterbatasan besar karena implementasi dukungan offline yang sesungguhnya sangat sulit
- Alasan terbesarnya adalah kompleksitas sinkronisasi; ketika data diubah secara bersamaan di beberapa perangkat, hasilnya pada akhirnya harus berkonvergensi ke status yang persis sama
- Ada dua tantangan teknis utama: ketidakpastian urutan waktu dan konflik
- Untuk menyelesaikan masalah ini, diperlukan penerapan desain sistem terdistribusi seperti Hybrid Logical Clocks(HLCs) dan CRDTs
- Dengan memanfaatkan ekstensi berbasis SQLite, dimungkinkan untuk menyediakan arsitektur sinkronisasi yang andal dan sederhana, dan ini dapat digunakan di semua platform
Janji dan realitas aplikasi offline-first
- Aplikasi offline-first mengusung respons instan, jaminan privasi dasar, dan dapat digunakan tanpa menunggu loading bahkan di lingkungan jaringan yang tidak stabil
- Dalam praktiknya, sebagian besar aplikasi gagal mengimplementasikan dukungan offline dengan benar; kebanyakan hanya mengadopsi metode menyimpan perubahan sementara secara lokal lalu mengirimkannya saat koneksi jaringan tersedia nanti
- Implementasi seperti ini kurang andal, dan pada akhirnya memunculkan pesan peringatan seperti "perubahan mungkin tidak tersimpan"
Kesulitan mendasar sinkronisasi
- Saat membuat aplikasi local-first, pada dasarnya Anda tak terhindarkan membangun sistem terdistribusi
- Beberapa perangkat dapat mengubah data secara independen saat offline, dan ketika terhubung kembali nantinya, semuanya harus berkonvergensi secara akurat ke status yang sama
- Untuk itu ada dua tantangan besar
- Ketidakpastian urutan peristiwa
- Konflik pada data yang sama
1. Ketidakpastian urutan peristiwa
- Peristiwa terjadi di beberapa perangkat pada waktu yang berbeda, dan status dapat berubah tergantung urutannya
- Contoh: perangkat A menetapkan x=3, perangkat B menetapkan x=5 → setelah masing-masing berubah saat offline lalu disinkronkan, bisa muncul hasil yang berbeda
- Database terpusat tradisional mengatasinya dengan konsistensi kuat, tetapi ini membutuhkan sinkronisasi global sehingga tidak cocok untuk sistem local-first
- Pada akhirnya, urutan yang tepat untuk tiap peristiwa harus ditentukan bahkan dalam lingkungan dinamis dan terdistribusi, sehingga dibutuhkan cara menentukan urutan tanpa jam pusat
Penerapan Hybrid Logical Clocks(HLCs)
- Hybrid Logical Clocks(HLCs) adalah algoritme sederhana namun efektif yang memungkinkan urutan peristiwa antarperangkat disepakati secara praktis
- HLC menggunakan gabungan informasi waktu fisik dan penghitung logis
- Sebagai contoh:
- Perangkat A mencatat peristiwa pada pukul 10:00:00.100, HLC menjadi (10:00:00.100, 0)
- Perangkat B yang menerima pesan, meskipun jamnya lebih lambat, menaikkan HLC menjadi (10:00:00.100, 1)
- Dengan demikian, urutan peristiwa dapat ditentukan secara akurat terlepas dari perbedaan jam fisik kedua perangkat
2. Masalah konflik
- Menerapkan urutan yang benar saja tidak cukup; jika data yang sama dimodifikasi secara independen di perangkat berbeda, konflik pasti akan terjadi
- Sebagian besar sistem mengharuskan developer menulis kode penyelesaian konflik secara manual, tetapi ini menimbulkan risiko kesalahan dan beban pemeliharaan
Pemanfaatan CRDTs
- Menerapkan Conflict-Free Replicated Data Types(CRDTs) adalah pendekatan terbaik
- CRDTs menjamin bahwa apa pun urutan sinkronisasinya, atau meskipun diterapkan berulang, status tiap perangkat pada akhirnya akan selalu sama
- Strategi CRDT paling sederhana adalah Last-Write-Wins(LWW)
- Memberi stempel waktu pada setiap pembaruan
- Saat sinkronisasi, nilai dengan stempel waktu yang lebih baru dipilih
Keunggulan SQLite
- Saat membangun aplikasi local-first, DB lokal yang ringan dan andal sangat penting, dan SQLite adalah pilihan terbaik
- Jika fungsi sinkronisasi diimplementasikan lewat ekstensi framework berbasis SQLite, ada manfaat seperti berikut
- Penerapan pesan sederhana: ambil nilai saat ini → jika stempel waktu baru lebih mutakhir maka timpa → jika tidak, abaikan
- Pendekatan ini menjamin konvergensi status di semua perangkat tanpa bergantung pada urutan sinkronisasi
Makna arsitektur ini
- Struktur ini mewujudkan sinkronisasi yang sederhana dan andal
- Tetap andal tanpa kehilangan data bahkan saat offline selama berminggu-minggu
- Sifat deterministik yang selalu berkonvergensi ke status akhir
- Dapat diselesaikan hanya dengan ekstensi SQLite ringan tanpa dependensi berat
- Mendukung semua platform utama seperti iOS, Android, macOS, Windows, Linux, WASM
Saran untuk developer
- Perlu menghindari cara yang hanya 'meniru' dukungan mode offline dengan antrean permintaan sederhana
- Perlu menerima konsep eventual consistency dan memanfaatkan teknik sistem terdistribusi yang telah terbukti seperti HLC dan CRDT
- Dibanding framework besar dan kompleks, lebih baik mengejar struktur kecil tanpa dependensi
- Hasilnya, aplikasi dapat memperoleh keunggulan seperti langsung responsif, bisa digunakan offline, dan jaminan privasi dasar
Panduan rujukan open source SQLite-Sync
- Jika tertarik pada engine offline-first lintas platform open source yang siap langsung dipakai di production, Anda dapat merujuk ke ekstensi SQLite-Sync
1 komentar
Komentar Hacker News
Cache-Controldengan benar pada respons API dan mematuhinya di lapisan jaringan. Dengan begitu, perubahan masa hidup cache di server bisa langsung berlaku tanpa perlu update app