π Topik β CAP Theorem & PACELC: Kenapa "CA" Itu Mitos
Kategori: Distributed Systems Β· Level: Advanced Β· Tanggal sesi: 19 Oktober 2026
π― Tujuan Belajar
Setelah sesi ini, keputusan arsitektur berikut harus lebih tajam:
- Berhenti memilih "CA" di slide arsitektur β dan bisa menjelaskan ke stakeholder kenapa pilihan itu tidak ada.
- Memilih per-operasi, per-kelas-data, bukan per-database. Satu sistem bisa CP untuk saldo dan AP untuk keranjang.
- Menghitung biaya nyata dari pilihan CP: bukan "unavailable", tapi berapa lama dan siapa yang nunggu.
- Membedakan CAP-C (linearizability) dari ACID-C (constraint) β dua hal berbeda yang sering tertukar di diskusi desain.
π§ Penjelasan Inti
Definisi formal (Gilbert & Lynch, 2002 β pembuktian formal dari konjektur Brewer 2000):
| Huruf | Definisi formal | Yang sering disalahartikan |
|---|---|---|
| C β Consistency | Linearizability: setiap operasi terlihat atomik, real-time ordering dijaga. Read setelah write sukses harus melihat write itu. | "ACID consistency" (integritas constraint). Beda total. |
| A β Availability | Setiap request ke node yang tidak gagal harus menghasilkan response non-error. Tanpa batas waktu. | "Uptime 99.99%". CAP-A itu absolut, bukan SLA. |
| P β Partition tolerance | Sistem tetap beroperasi meski pesan antar-node hilang/delay arbitrer. | "Fitur opsional yang bisa dimatikan". |
Teorema: Dalam model network asynchronous (delay tak terbatas, tanpa clock global), tidak ada sistem terdistribusi yang bisa menjamin C dan A secara simultan saat P terjadi. Buktinya via kontradiksi: jika ada partisi, node di sisi berbeda tidak bisa membedakan "peer mati" dari "peer hidup tapi pesannya ditahan". Untuk tetap Available, ia harus menjawab dengan informasi lokal β bisa divergen β C dilanggar. Untuk tetap Consistent, ia harus menolak menjawab β A dilanggar.
Kenapa "CA" mitos: P bukan pilihan desain, tapi properti lingkungan. Network partition terjadi karena: kabel putus, switch reboot, BGP misconfig, NIC drop, GC pause 3 detik yang bikin heartbeat timeout, kernel panic, cloud AZ terisolasi. Engineer tidak bisa "memilih untuk tidak kena partisi". Jadi pilihan sebenarnya cuma dua: CP atau AP saat partisi. Sistem "CA" = sistem single-node (tidak terdistribusi) β dan bahkan itu kena partisi antara aplikasi dan DB-nya.
Penting: CAP hanya bicara saat partisi. Di 99.9% waktu tanpa partisi, CAP tidak memberi guidance apa pun. Itulah kenapa PACELC ada.
βοΈ Cara Kerja Internal
1. Kenapa C dan A benar-benar bertabrakan β mekanismenya
Bayangkan dua node, N1 dan N2, partisi total. Client menulis x = 1 ke N1.
Tanpa partisi:
N1 ββreplikasiββ> N2 read di N2 β x=1 β C dan A
Dengan partisi:
N1 β³β³β³ N2
Pilihan CP: N1 tolak write (butuh quorum), N2 tolak read β A dilanggar
Pilihan AP: N1 terima write lokal, N2 jawab x=0 (stale) β C dilanggar
Tidak ada jalan ketiga. Untuk jawab benar, N2 harus tahu isi N1 β mustahil saat partisi. Untuk jawab cepat, N2 harus jawab tanpa tahu.
2. "Partition" bukan biner β ini yang bikin CAP praktis lebih lunak
Brewer (2012, "CAP Twelve Years Later") mengoreksi interpretasinya sendiri: partisi itu jarang, dan ketika terjadi, pilihannya bukan biner tapi spektrum:
- Deteksi partisi butuh timeout. Karena sistem async tidak bisa membedakan slow vs dead (FLP impossibility), timeout adalah tebakan. Timeout 1s β banyak false positive β sistem jadi unavailable padahal network sehat tapi lag sesaat.
- Recovery: setelah partisi pulih, state harus direkonsiliasi. Ini bagian yang paling sering diabaikan dan paling sering jadi sumber bug produksi.
- Pilihan per-operasi: sistem yang sama bisa CP untuk
transfer()dan AP untukupdate_last_seen().
3. PACELC β melengkapi CAP (Abadi, 2012, IEEE Computer)
If Partition β A or C. Else β Latency or Consistency.
Saat tidak ada partisi, tetap ada trade-off: untuk konsisten kuat, koordinasi butuh round-trip. Round-trip butuh waktu. Jadi: konsistensi selalu dibayar dengan latency. Ini fisika, bukan pilihan vendor β cahaya dalam fiber ~200.000 km/s, jadi RTT JakartaβSingapura (~900 km) minimal ~9ms murni propagation, real-world 20β30ms. Cross-region USβAsia: 150β250ms. Tidak ada hardware yang menghapus ini.
Klasifikasi PACELC (dari paper Abadi; koarse, dan bisa berubah antar versi):
| Kelas | Saat Partisi | Normal | Contoh sistem |
|---|---|---|---|
| PC/EC | Consistency | Consistency | BigTable, HBase, Spanner* |
| PA/EL | Availability | Latency | Dynamo, Cassandra, Riak |
| PA/EC | Availability | Consistency | MongoDB (desain awal) |
| PC/EL | Consistency | Latency | PNUTS (Yahoo) |
* Spanner menarik: ia PC/EC tapi latency-nya rendah karena TrueTime β jam atom/GPS memberi batas error ~7ms, jadi commit-wait-nya pendek. Ini bukti bahwa trade-off bisa digeser dengan biaya hardware, bukan dihapus.
4. Middle ground: session guarantees
Banyak sistem tidak butuh linearizability penuh, tapi tidak mau eventual consistency buta. Yang tersedia:
- Read-your-writes β user selalu lihat write-nya sendiri (route ke primary, atau simpan write timestamp di session).
- Monotonic reads β tidak pernah "mundur" ke state lebih lama.
- Consistent prefix β write terlihat berurutan, tidak melompat.
Ini jauh lebih murah dari linearizability dan menutup 90% keluhan user nyata ("kok data saya hilang?").
ποΈ Diagram β Pohon Keputusan Praktis
Operasi ini menyentuh uang / kuota / stok terbatas?
ββ YA β CP. Quorum write (W > N/2), tolak saat quorum loss.
β Konsekuensi: harus punya jalur degradasi (retry queue, antrian).
β Contoh: transfer, pembayaran, alokasi nomor unik, booking kursi.
ββ TIDAK
ββ Apakah user bisa mentoleransi melihat data sendiri yang basi?
ββ TIDAK (read-your-writes wajib)
β β AP + session stickiness / read-from-primary-after-write.
β Contoh: profil, setting, post yang baru dibuat.
ββ YA
β AP/EL. Eventual consistency + reconciliation job.
Contoh: feed, counter like, last_seen, rekomendasi, search index.
Pertanyaan lanjutan yang sering dilupakan: siapa yang menang saat konflik? Butuh conflict resolution strategy eksplisit β LWW (timestamp, rawan clock skew), vector clock (deteksi konflik, tapi harus diselesaikan manual), CRDT (merge otomatis, tapi terbatas tipe data).
βοΈ Trade-off & Kapan JANGAN Dipakai
Kapan JANGAN pakai CP (konsistensi kuat):
- Operasi high-throughput yang tidak butuh ordering, mis. counter view, log aktivitas, presence. Membayar koordinasi di sini = buang latency tanpa manfaat.
- Sistem yang harus tetap hidup saat satu region mati total. CP dengan quorum di 2 region dari 3 = region ketiga harus online. Kalau tidak ada, sistem mati total β availability 0.
- Read-heavy geo-distributed yang user-nya sensitif latency. Cross-region quorum read = 200ms+ per request.
Kapan JANGAN pakai AP (eventual consistency):
- Ada invariant yang tidak boleh dilanggar sesaat pun: saldo tidak boleh negatif, kuota tidak boleh oversold, username unik. Eventual consistency di sini = duplikasi yang tidak bisa "di-un-do" secara sosial (dua orang sudah lihat username itu).
- Ketika biaya rekonsiliasi lebih besar dari biaya koordinasi. Rekonsiliasi butuh: deteksi konflik, aturan merge, audit trail, dan sering butuh manusia. Koordinasi butuh ~10ms.
- Regulatory/audit requirement β "kami tidak tahu mana yang benar" bukan jawaban yang diterima auditor.
Biaya tersembunyi CP yang jarang dihitung:
| Biaya | Penjelasan |
|---|---|
| Latency floor | Setiap write butuh quorum RTT. Tidak bisa di-cache, tidak bisa di-CDN. |
| Blast radius | Quorum loss = write mati total, bukan degradasi bertahap. |
| False partition | Timeout agresif + GC pause = sistem menolak write padahal network sehat. |
| Failover cost | Leader election butuh waktu (Raft default election timeout 150β300ms, real-world 1β10s dengan deteksi). Selama itu, write tertahan. |
Biaya tersembunyi AP:
| Biaya | Penjelasan |
|---|---|
| Rekonsiliasi | Kode merge, job periodik, dan jalur manual. Sering lebih banyak kode dari fitur utamanya. |
| Bug kelas baru | Read-after-write anomaly, "phantom delete" (delete lalu muncul lagi karena replika lama menang), counter drift. |
| Debugging | Bug tidak reproducible β tergantung timing replikasi. |
π Contoh Produksi & Failure Mode
1. Dynamo (Amazon, 2007) β AP by design, dan alasannya bisnis
Paper-nya eksplisit: pilihan "always writable" diambil karena Add to Cart yang gagal = uang hilang. Cart yang konflik di-merge (union semantics), bukan ditolak. Pelajaran: keputusan konsistensi itu keputusan produk, bukan keputusan infrastruktur. Merge semantics harus didesain bersama datanya.
2. GitHub, 21 Oktober 2018 β split-brain 24 jam Partisi network antara datacenter US East Coast dan West Coast. Orchestrator melakukan failover MySQL ke primary baru di sisi yang salah, sementara primary lama masih menerima write dari sisi lain β dua primary. Selama ~24 jam, data divergen dan aplikasi menampilkan state tidak konsisten. Pelajaran: masalahnya bukan "pilih CP atau AP", tapi proses failover-nya sendiri yang butuh fence (STONITH, epoch number, atau lease) agar primary lama tidak bisa menulis. Tanpa fencing, sistem yang secara teori CP bisa berperilaku AP secara tidak sengaja.
3. Last-Write-Wins menghapus data secara diam-diam LWW pakai timestamp dari client. Clock skew antar device bisa menit, bahkan jam. Write yang lebih baru secara logis bisa kalah karena jam device-nya mundur. Tidak ada error, tidak ada log β data hilang diam-diam. Pelajaran: LWW hanya aman kalau kehilangan write tidak berdampak, atau kalau timestamp dari sumber terpusat (HLC, TrueTime).
4. Quorum "mayoritas" tanpa memahami sloppy quorum
Cassandra W=QUORUM, R=QUORUM dengan N=3 terlihat seperti strong consistency (R+W > N). Tapi dengan hinted handoff dan sloppy quorum, write bisa diterima node di luar replica set β R+W>N tidak lagi menjamin linearizability. Konsistensi Cassandra bersifat tunable, bukan transaksional β dan read repair butuh waktu. Pelajaran: baca dokumentasi konsistensi sampai level mekanisme, bukan level marketing.
5. "Kami pakai Spanner jadi kami CP" Spanner butuh TrueTime β jam atom + GPS di tiap datacenter, dengan bounded uncertainty. Tanpa itu, commit-wait tidak bisa dihitung. Cloud lain meniru dengan pendekatan berbeda (clock sync + lease). Pelajaran: "CP dengan latency rendah" biasanya berarti membayar hardware khusus atau menerima batas akurasi clock yang lebih longgar. Copy arsitektur tanpa copy asumsinya = bug.
β οΈ Miskonsepsi Umum
| Miskonsepsi | Koreksi |
|---|---|
| "Pilih 2 dari 3" | P tidak bisa dipilih. Hanya C vs A, dan hanya saat partisi. |
| "CA itu pilihan yang valid" | Hanya untuk single-node, yang bukan sistem terdistribusi. |
| "CAP-C = ACID-C" | CAP-C = linearizability. ACID-C = constraint integrity. Sistem bisa ACID tanpa linearizable (single-node Postgres) dan linearizable tanpa constraint. |
| "CAP-A = high availability" | CAP-A = setiap node non-failed harus jawab. Sistem 99.99% uptime tetap bisa melanggar CAP-A saat partisi karena menolak write. |
| "NoSQL = AP, SQL = CP" | Salah total. Postgres dengan synchronous replication = CP. CockroachDB = CP. Cassandra bisa SERIAL consistency. MongoDB bisa write concern majority. |
| "Eventual consistency = aman, cuma delay" | Hanya aman jika ada conflict resolution yang benar dan invariant yang tidak dilanggar. Tanpa itu = data loss. |
| "Partisi itu langka, abaikan saja" | Langka per-node, tapi di sistem besar (ribuan node) hampir pasti terjadi terus-menerus. Google melaporkan partisi harian di skala cluster besar. |
| "PACELC menggantikan CAP" | Melengkapi. PACELC menambahkan dimensi latency untuk kasus tanpa partisi β kasus yang justru paling sering. |
β Cek Pemahaman
-
Sistem kamu pakai Postgres dengan synchronous replication ke 2 replika di 3 AZ,
synchronous_commit = on,ANY 2. Region ke-4 (DR) menerima async. Saat AZ-1 dan AZ-2 terisolasi dari AZ-3, apakah sistem ini CP atau AP? Apa yang terjadi pada write, dan apa yang terjadi pada read dari AZ-3? Apa yang harus dilakukan saat partisi pulih? -
Sebuah fitur "kuota voucher 1000 unit" dijalankan di Cassandra dengan
W=ONE. Apa failure mode-nya saat dua request masuk bersamaan ke node berbeda? Kalau kamu harus mempertahankan Cassandra, di mana kamu menaruh penjagaannya β dan apa konsekuensi latency-nya? -
Tim kamu bilang "kita butuh strong consistency untuk fitur komentar". Bantah atau dukung dengan argumen teknis: apa yang sebenarnya dibutuhkan user, apa biaya linearizability di sini, dan alternatif apa yang lebih tepat?
π Poin Kunci
- CAP berlaku hanya saat partisi. Tanpa partisi, CAP diam β PACELC yang bicara (latency vs consistency).
- "CA" bukan pilihan. P adalah properti lingkungan, bukan knob desain.
- Keputusan konsistensi itu per-operasi dan per-kelas-data, bukan per-database. Satu sistem hampir selalu butuh keduanya.
- CAP-C β ACID-C. Jangan campur di diskusi desain; bikin kesimpulan salah.
- Biaya CP = latency + blast radius + fencing. Biaya AP = rekonsiliasi + bug non-reproducible. Keduanya nyata, keduanya harus dianggarkan.
- Tanpa conflict resolution eksplisit, AP = data loss yang diam. Tentukan pemenang konflik sebelum memilih AP.
- Failover butuh fence. Sistem CP yang failover tanpa fencing berubah jadi split-brain β AP tanpa sadar.
β‘οΈ Eksplorasi Lanjut
- Consistency models berjenjang β linearizable β sequential β causal β read-your-writes β eventual. Kapan causal cukup? (Causal+ consistency di COPS paper.)
- Consensus internals β Raft (leader election, log replication, safety) vs Paxos. Kenapa Raft menang di implementasi praktis.
- CRDT β G-Counter, LWW-Register, OR-Set, dan batasannya. Kapan merge otomatis mustahil.
- Transactional isolation β read committed vs snapshot isolation vs serializable, dan anomali yang tersisa di tiap level (write skew, phantom).
- Time & ordering β HLC (Hybrid Logical Clock), TrueTime, dan kenapa wall clock tidak bisa dipercaya untuk ordering.
- Bacaan: Brewer, "CAP Twelve Years Later" (IEEE Computer, 2012) Β· Abadi, "Consistency Tradeoffs in Modern Distributed Database System Design" (IEEE Computer, 2012) Β· Kleppmann, Designing Data-Intensive Applications, ch. 5 & 9 Β· Jepsen reports untuk melihat bagaimana klaim konsistensi vendor diuji secara empiris.