Kamus CRDT: panduan praktis untuk struktur data terdistribusi
(iankduncan.com)- CRDT(Conflict-free Replicated Data Type, tipe data replikasi tanpa konflik) adalah struktur data terdistribusi yang memungkinkan penggabungan data yang konsisten tanpa koordinasi bahkan dalam situasi partisi jaringan atau modifikasi serentak
- Jika penggabungan data memenuhi komutatif, asosiatif, dan idempoten, semua replika pada akhirnya akan berkumpul ke keadaan yang sama
- Bentuk yang representatif antara lain G-Counter, PN-Counter, G-Set, 2P-Set, OR-Set, LWW-Register, MV-Register, RGA, WOOT, Logoot dan lain-lain, yang masing-masing menangani kebutuhan penambahan, penghapusan, penambahan ulang, dan pemeliharaan urutan yang berbeda
- Delta CRDT meningkatkan efisiensi dengan mengirim hanya perubahan alih-alih seluruh keadaan, dan Garbage Collection adalah tantangan penting untuk mengatasi masalah akumulasi metadata
- CRDT bukan solusi sempurna, tetapi dinilai sebagai pilihan yang kuat dalam sistem yang ketersediaannya lebih penting daripada konsistensi langsung
Konsep dasar CRDT
- CRDT adalah struktur data yang dapat digabung tanpa koordinasi meskipun terjadi modifikasi serentak di lingkungan terdistribusi
- Jika operasi penggabungan bersifat komutatif(commutative), asosiatif(associative), dan idempoten(idempotent), semua replika akan berkumpul ke keadaan yang sama
- Dirancang berdasarkan konsep Lattice(kisi) agar keadaan selalu bergerak hanya ke arah “atas”
- Contoh: G-Counter menggabungkan hitungan tiap replika dengan
maxuntuk menjamin penjumlahan tanpa kehilangan
- Contoh: G-Counter menggabungkan hitungan tiap replika dengan
- CRDT memiliki dua pendekatan: State-based(CvRDT) dan Operation-based(CmRDT)
- CvRDT menggabungkan seluruh keadaan, sedangkan CmRDT menyebarkan operasi
Jenis-jenis utama CRDT
- G-Counter: penghitung yang hanya bisa bertambah, menjumlahkan nilai dari tiap replika
- PN-Counter: mendukung hitungan dua arah dengan menggabungkan G-Counter untuk kenaikan dan penurunan
- G-Set: himpunan yang hanya bisa ditambah
- 2P-Set: dapat ditambah dan dihapus, tetapi tidak bisa ditambahkan ulang
- LWW-Element-Set: operasi terbaru menang berdasarkan timestamp
- OR-Set: menggunakan tag unik untuk menggabungkan tanpa kehilangan data saat penambahan serentak, dengan perilaku add-wins
- LWW-Register / MV-Register: untuk menyimpan satu nilai; LWW memiliki satu pemenang, MV mempertahankan semua nilai serentak
- OR-Map: struktur map yang menggabungkan OR-Set untuk tiap kunci
- RGA / WOOT / Logoot / LSEQ: CRDT untuk data sekuens yang memiliki urutan
- RGA berbasis pohon, WOOT berbasis referensi dua arah, Logoot/LSEQ berbasis pengenal posisi
Konsep CRDT lanjutan
- Causal CRDTs: melacak hubungan kausal menggunakan version vector, sehingga deteksi konflik menjadi lebih akurat
- Delta CRDTs: meningkatkan efisiensi jaringan dengan mengirim hanya perubahan (delta), bukan seluruh keadaan
- Tree CRDTs: mendukung replikasi data berstruktur hierarkis (seperti sistem file), dengan kebutuhan menjaga relasi induk-anak
- Observed-Remove Shopping Cart: contoh keranjang belanja e-commerce yang menggabungkan OR-Set dan PN-Counter
Masalah Garbage Collection
- Demi konvergensi, CRDT terus mengakumulasi metadata sehingga timbul masalah pertumbuhan tak terbatas
- Contoh: tag pada OR-Set, tombstone pada RGA
- Ada berbagai strategi seperti kedaluwarsa berbasis waktu, penghapusan berbasis konsensus, pelacakan kausal berbasis version vector, penetapan batas atas metadata, dan checkpoint/rebase
- Setiap pendekatan memerlukan kompromi antara keamanan(mencegah kebangkitan zombie) dan efisiensi ruang
Panduan performa dan pemilihan
- Kompleksitas ruang dan waktu tiap jenis CRDT berbeda tergantung jumlah replika, jumlah elemen, jumlah tag, dan sebagainya
- G/PN-Counter sebanding dengan jumlah replika, OR-Set sebanding dengan jumlah tag, RGA menumpuk tombstone
- Delta CRDT sangat meningkatkan performa penggabungan
- Kriteria pemilihan:
- Hanya perlu penambahan → G-Counter, G-Set
- Perlu penghapusan, tidak perlu penambahan ulang → 2P-Set
- LWW dapat diterima → LWW-Set/Register
- Perlu mempertahankan modifikasi serentak → OR-Set, MV-Register
- Perlu menjaga urutan → RGA, Logoot
- Struktur bertingkat → OR-Map
Kesimpulan
- CRDT menjamin konvergensi tanpa koordinasi, tetapi memiliki kelemahan berupa pertambahan metadata dan kompleksitas
- Berguna dalam sistem yang memprioritaskan ketersediaan, dan tiap CRDT dioptimalkan untuk jenis masalah tertentu
- Dalam praktik, CRDT digunakan berdampingan dengan basis data tradisional, dan strategi garbage collection menjadi keharusan
- Tidak ada “CRDT yang sempurna”; yang terpenting adalah memilih sesuai kebutuhan aplikasi
1 komentar
Komentar Hacker News
Salah satu hal menarik tentang CRDT adalah bahwa ini bukan sekadar library yang menggabungkan beberapa CRDT tingkat rendah
Misalnya, Automerge sendiri adalah CRDT yang utuh, dan menjamin konsistensi bahkan di bawah konkurensi melalui pembuktian matematis
Tim Automerge memverifikasi desainnya dengan alat pembuktian teorema seperti Isabelle, dan menargetkan implementasi yang cepat sekaligus akurat dengan menerapkan teknik performa terbaru dari dunia database
Jika Anda membangun SaaS yang memerlukan kolaborasi real-time (misalnya Notion, Figma), Anda bisa langsung menerapkan struktur data kolaboratif tanpa harus memahami teori yang rumit
Backend cukup berupa penyimpanan key-value sederhana, dan frontend cukup dengan satu library
Saya juga pernah membuat library automerge berbasis Redis, dan bisa mengimplementasikan server sinkronisasi persisten yang lengkap dengan memanfaatkan pub/sub
Saya juga dengan cepat menyelesaikan demo sinkronisasi dokumen antar beberapa browser dengan memanfaatkan fitur websocket dari Webdis
Jika menginginkan DX yang lebih baik dan full-stack DB berbasis CRDT, saya merekomendasikan Triplit.dev. Kecepatan pengembangannya memang agak melambat, tetapi fiturnya sudah cukup matang
Secara pribadi saya juga suka Loro, tetapi strukturnya masih berbasis dokumen, sehingga mesin kuerinya kurang memadai. Untuk mendapatkan data yang diinginkan, kita harus menunjuk item bersarang tertentu secara langsung
Ini tulisan yang tersusun dengan baik, dari dasar hingga konsep lanjutan CRDT
Sebagai referensi, Riak masih terus dipelihara dalam bentuk OpenRiak
Selama dua tahun terakhir saya mengembangkan CRDT sendiri, tetapi saya sadar ada terlalu banyak trade-off, jadi akhirnya beralih ke framework OT berbasis ID
Saya berencana meluncurkan Docnode.dev Selasa ini. Saya ingin mendengar masukan
Ke depannya saya juga berencana menambahkan mode CRDT untuk situasi yang membutuhkan P2P
CRDT atau OT adalah struktur yang dimaksudkan untuk menangani saat orang mengedit paragraf yang sama secara bersamaan, tetapi dalam praktiknya situasi seperti itu hampir tidak pernah terjadi
OR-Set yang disebut dalam artikel ini mirip dengan metode merge yang dulu digunakan Monotone sejak 2005
Materi terkait bisa dilihat di dokumentasi MarkMerge
CRDT masih merupakan area yang harus diimplementasikan sendiri
Dua bulan lalu saya juga membuat mesin CRDT berbasis sekuens, terinspirasi dari diamond types
Saya meminta bantuan AI, tetapi sama sekali tidak membantu untuk masalah yang berpusat pada logika seperti ini
Saya merasa perlu ada black-box test untuk memverifikasi apakah LLM bisa memahami logika baru
Artikelnya bagus, tetapi menurut saya glosari istilahnya harus punya indeks (index)
Saya jadi berpikir apakah CRDT pada akhirnya hanya mendorong konflik merge dari DB ke logika aplikasi
Jika ditulis dengan benar, penyelesaian merge otomatis bisa dilakukan di lapisan mana pun
Masalah terbesarnya adalah menangani konflik UNIQUE/PRIMARY KEY
Ini bisa diatasi dengan membagikan namespace ID ke tiap server, membuat pembuatan pertama menjadi pemenang, lalu saat konflik terjadi mengubah nama atau menghapusnya
Jika menggunakan skema EAV, penelusuran graf bisa dengan mudah diimplementasikan di SQL menggunakan CTE rekursif
Namun, PostgreSQL tidak memiliki tipe ANY sehingga sulit merepresentasikan objek dengan atribut yang beragam, dan fitur FOREIGN KEY juga harus diimplementasikan sendiri
Meski begitu, struktur EAV tetap menguntungkan untuk desain meta-skema seperti pewarisan
Akan bagus jika tipe CRDT bisa didefinisikan langsung di PostgreSQL, tetapi saat ini pembatasan operasi monoid tidak dimungkinkan
Pada akhirnya, CRDT untuk kolom non-key harus ditangani di lapisan aplikasi
Singkatnya, CRDT bisa diimplementasikan juga di dalam RDBMS, tetapi pendekatannya berbeda tergantung di mana logika bisnis diletakkan