3.3 Sistem terdistribusi
Tinjauan dan motivasi
Sistem terdistribusi adalah sistem apa pun yang komponennya berjalan pada lebih dari satu mesin dan berkoordinasi lewat jaringan. Begitu Anda melintasi batas proses melalui jaringan, Anda mewarisi beberapa kebenaran pahit yang sama sekali tidak ada di dalam satu proses. Jaringan tidak andal, dan latensinya bervariasi. Pesan dapat hilang, terduplikasi, tertunda, atau tertukar urutan. Komponen jarak jauh gagal sendiri. Tidak ada jam bersama. ”Kekeliruan komputasi terdistribusi” klasik (jaringan andal, latensi nol, bandwidth tak terbatas, topologi tidak pernah berubah) menamai persis asumsi yang menyebabkan pemadaman. Tugas Anda adalah merancang untuk kenyataan ini sejak awal, alih-alih menemukannya kembali selama insiden.
Bagi organisasi besar, distribusi bukan opsional. Sistem apa pun yang melayani skala nasional atau global, menyatukan beberapa departemen, atau membutuhkan ketersediaan tinggi akan mencakup banyak mesin, pusat data, dan sering wilayah. Enterprise menjalankan sistem transaksi terdistribusi, pipeline peristiwa, dan deployment multiwilayah. Pemerintah menjalankan integrasi antarlembaga di mana setiap lembaga memiliki sistemnya sendiri dan tak seorang pun mengendalikan keseluruhan. Di sini jarak antara desain yang kokoh dan yang rapuh muncul sebagai pemadaman berita utama, pembayaran tunjangan yang terlewat, dan konsekuensi regulasi. Teknik dalam bab ini (penalaran konsistensi, idempotensi, retry dengan backoff, circuit breaker, saga, dan observabilitas terdistribusi) adalah pertahanan baku Anda.
Bagian tersulit sistem terdistribusi adalah bahwa kegagalan bersifat parsial dan intermiten. Program satu mesin entah berfungsi atau crash. Sistem terdistribusi dapat setengah berfungsi: sebagian permintaan sukses, sebagian timeout, dan sebagian hilang diam-diam, semuanya sekaligus. Bab ini berfokus pada penalaran dan pola yang memungkinkan tim besar membangun sistem yang merosot dengan anggun dan tetap dapat dipahami di bawah kegagalan parsial.
Prinsip utama
- Jaringan tidak andal. Rancang setiap interaksi jarak jauh dengan mengasumsikan ia bisa lambat, gagal, terduplikasi, atau tertukar urutan.
- Anda tidak dapat memiliki konsistensi sempurna dan ketersediaan sempurna selama partisi. Pilih dengan sengaja per interaksi (CAP/PACELC), dan ingat latensi adalah biaya bahkan ketika tidak ada partisi.
- Buat operasi idempoten. Jika operasi dapat diulang dengan aman, sebagian besar penanganan kegagalan terdistribusi menjadi dapat diatasi.
- Setiap panggilan jarak jauh membutuhkan timeout. Penantian tak terbatas mengubah satu dependensi lambat menjadi pemadaman seluruh sistem.
- Pilih konsistensi akhirnya di mana bisnis mengizinkan, tetapi buat eksplisit. Pengguna dan auditor harus memahami kapan mereka mungkin melihat data basi.
- Isolasi kegagalan. Bulkhead dan circuit breaker menghentikan satu komponen yang gagal agar tidak berantai ke semuanya.
- Anda tidak dapat men-debug apa yang tidak dapat Anda lihat. Alur terdistribusi membutuhkan pelacakan, metrik, dan log berkorelasi di setiap lompatan.
- “Pengiriman tepat-sekali” adalah mitos; pemrosesan tepat-sekali adalah pencapaian rekayasa. Rancang untuk setidaknya-sekali dengan deduplikasi.
Rekomendasi
Bernalar tentang konsistensi dengan CAP dan PACELC
Teorema CAP mengatakan bahwa selama partisi jaringan sistem harus memilih antara konsistensi (setiap pembacaan melihat tulisan terbaru) dan ketersediaan (setiap permintaan mendapat respons). PACELC menambahkan pertukaran kedua: Else (ketika tidak ada partisi) Anda tetap menukar Latensi dengan Consistency. Jangan cap ini sebagai label seluruh sistem. Putuskan per operasi. Transfer saldo bank membutuhkan konsistensi kuat dan akan menolak alih-alih mempertaruhkan pengeluaran ganda. Umpan sosial atau penghitung tampilan produk dapat menerima kebasian sebagai ganti ketersediaan dan kecepatan. Tuliskan model konsistensi mana yang dipakai setiap alur data (kuat, kausal, baca-tulisan-sendiri, atau akhirnya) agar tak seorang pun mengasumsikan jaminan yang sebenarnya tidak disediakan sistem.
Bangun idempotensi, timeout, retry, dan backoff bersama
Perlakukan keempat teknik ini sebagai satu paket. Beri setiap operasi jarak jauh timeout, agar dependensi yang menggantung tidak dapat memblokir thread selamanya. Saat gagal, coba ulang, tetapi hanya untuk operasi yang aman diulang. Aman diulang berarti idempoten: tetapkan kunci unik untuk setiap permintaan dan minta penerima melakukan deduplikasi, sehingga “tagih kartu” yang dicoba ulang tidak menagih dua kali. Beri jarak retry Anda dengan exponential backoff dan jitter, agar Anda menghindari badai retry tersinkron yang mengubah gangguan singkat menjadi penolakan layanan yang ditimbulkan sendiri. Batasi jumlah retry dan anggaran waktu total, karena mencoba ulang selamanya hanya memindahkan kegagalan. Tanpa idempotensi, retry berbahaya. Tanpa backoff, retry merusak.
Tambahkan circuit breaker dan bulkhead untuk menghentikan kaskade
Circuit breaker mengawasi panggilan ke dependensi dan, setelah ambang kegagalan, “terbuka”: gagal cepat selama masa pendinginan alih-alih menumpuk lebih banyak permintaan pada layanan yang kesulitan, lalu “setengah terbuka” untuk menguji pemulihan. Ini menghentikan kaskade di mana layanan hilir yang lambat menghabiskan thread setiap pemanggil sampai seluruh sistem macet. Bulkhead mempartisi sumber daya (kolam thread, kolam koneksi) sehingga kejenuhan pada satu dependensi tidak dapat memakan kapasitas yang dibutuhkan yang lain. Padukan keduanya dengan degradasi anggun: ketika dependensi non-kritis tidak tersedia, kembalikan respons cache atau bawaan alih-alih menggagalkan seluruh permintaan.
Kelola transaksi terdistribusi dengan saga, bukan two-phase commit
Anda biasanya tidak dapat memegang satu transaksi ACID (Atomicity, Consistency, Isolation, Durability) melintasi beberapa layanan atau basis data. Two-phase commit terdistribusi lambat, mengunci sumber daya, dan memotong ketersediaan. Gunakan pola saga sebagai gantinya. Modelkan transaksi bisnis sebagai urutan transaksi lokal, masing-masing menerbitkan peristiwa yang memicu berikutnya, dengan tindakan kompensasi untuk setiap langkah guna membatalkannya jika langkah berikutnya gagal. Saga datang dalam dua rasa. Koreografi membuat layanan bereaksi terhadap peristiwa satu sama lain, tanpa pengendali pusat. Orkestrasi membuat koordinator pusat menggerakkan langkah-langkah, yang lebih mudah dinalar dan dipantau. Saga merangkul konsistensi akhirnya: sistem melewati keadaan antara lalu konvergen. Jadi rancang pengalaman pengguna dan jejak audit untuk memperhitungkan keadaan “sedang berjalan” dan “dikompensasi.”
Perlakukan tepat-sekali sebagai setidaknya-sekali ditambah deduplikasi
Broker pesan tidak dapat benar-benar menjamin pengiriman tepat-sekali melintasi kegagalan. Yang dapat dicapai mereka dan Anda adalah pengiriman setidaknya-sekali dengan pemrosesan idempoten, yang menghasilkan efek tepat-sekali. Rancang konsumen untuk menangani pesan duplikat dengan aman, memakai kunci idempotensi atau log pesan yang diproses. Ketahui jaminan urutan dan pengiriman broker Anda dengan tepat. Untuk streaming, pakai grup konsumen, partisi, dan manajemen offset dengan sengaja, dan jadikan pemrosesan ulang aman, agar Anda dapat memutar ulang aliran setelah perbaikan bug tanpa merusak status hilir.
Instrumentasikan alur terdistribusi dari ujung ke ujung
Adopsi tiga pilar observabilitas, berkorelasi lintas batas layanan. Rambatkan ID pelacakan/korelasi melalui setiap lompatan, agar Anda dapat mengikuti satu permintaan pengguna di semua layanan yang disentuhnya (pelacakan terdistribusi). Pancarkan metrik terstruktur (persentil latensi, tingkat galat, kejenuhan, throughput) per layanan dan per dependensi. Pancarkan log terstruktur yang membawa ID korelasi. Pakai semua ini untuk menetapkan sasaran tingkat layanan dan memberi peringatan pada gejala yang benar-benar dirasakan pengguna, seperti tingkat galat dan latensi, bukan hanya kesehatan mesin individual. Dalam sistem terdistribusi, observabilitas bukan perkakas opsional. Ia satu-satunya cara memahami perilaku di bawah kegagalan parsial.
Trade-off: kelebihan dan kekurangan
| Teknik | Kelebihan | Kekurangan / biaya |
|---|---|---|
| Konsistensi kuat | Model mental sederhana, tanpa pembacaan basi | Ketersediaan lebih rendah selama partisi, latensi lebih tinggi, biaya koordinasi |
| Konsistensi akhirnya | Ketersediaan tinggi, latensi rendah, skalabel | Pembacaan basi, penalaran kompleks, butuh resolusi konflik |
| Retry dengan backoff | Melewati kegagalan sementara secara otomatis | Memperkuat beban bila disalahgunakan; butuh idempotensi dan batas |
| Circuit breaker / bulkhead | Mencegah kegagalan berantai, gagal cepat | Kompleksitas tambahan, penyetelan ambang, risiko memicu terlalu dini |
| Saga (vs 2PC) | Skalabel, tersedia, tanpa lock terdistribusi | Konsistensi akhirnya, logika kompensasi, lebih sulit dinalar |
Trade-off utamanya adalah antara koordinasi dan independensi. Setiap jaminan yang Anda inginkan lintas mesin (konsistensi, urutan, tepat-sekali) memakan latensi, ketersediaan, atau kompleksitas. Ia mengharuskan mesin bersepakat, dan kesepakatan melalui jaringan yang tidak andal itu mahal. Keterampilannya adalah membeli hanya jaminan yang benar-benar dibutuhkan bisnis, operasi demi operasi, dan merancang sisanya untuk degradasi anggun. Beli konsistensi berlebihan dan sistem Anda menjadi lambat dan rapuh. Beli terlalu sedikit dan Anda mendapat kerusakan data diam-diam yang muncul sebagai kegagalan audit berbulan-bulan kemudian.
Pertanyaan untuk didiskusikan dengan tim Anda
Apakah pola ketahanan Anda dikirim sebagai bawaan platform bersama, atau setiap tim menciptakan ulang timeout dan retry? Bab ini memperlakukan idempotensi, timeout, retry terbatas, circuit breaker, dan pelacakan sebagai yang paling murah dan andal bila dibangun sekali ke dalam pustaka bersama dan bawaan platform. Dalam organisasi besar, membiarkan setiap tim meraciknya sendiri menjamin inkonsistensi: sebagian jalur mencoba ulang operasi tidak idempoten, sebagian tak punya timeout, sebagian tidak memancarkan ID korelasi. Bawa bukti dengan mengaudit sampel layanan dan menghitung berapa banyak yang menetapkan timeout eksplisit pada setiap panggilan jarak jauh dan merambatkan ID pelacakan dari ujung ke ujung. Jika angkanya rendah, perbaikannya adalah investasi platform, bukan memo pelatihan. Bawaan baku juga membuat ketahanan dapat diuji dan diaudit, yang makin diharapkan regulator di bidang keuangan dan pemerintah untuk Anda demonstrasikan.
Apakah timeout dan anggaran retry Anda tersusun lintas seluruh rantai panggilan, atau permintaan dalam mencoba ulang dirinya sendiri menjadi pemadaman? Satu permintaan sering melintasi banyak lompatan, dan jika setiap lapisan secara independen mencoba ulang tiga kali dengan timeout-nya sendiri, kegagalan terdalam berlipat dan pemanggil terluar menunggu jauh melewati batas yang dapat ditoleransi manusia mana pun. Tetapkan anggaran waktu total untuk permintaan yang menghadap pengguna dan bagi ke bawah rantai, agar layanan dalam tahu seberapa sedikit waktu tersisa dan gagal cepat alih-alih mencoba ulang ke dalam badai. Bawa graf dependensi Anda dan jejak nyata, lalu jumlahkan kombinasi timeout dan retry terburuk dan bandingkan dengan berapa lama pengguna sebenarnya akan menunggu. Exponential backoff dengan jitter dan batas atas total percobaan menjaga gangguan singkat agar tidak menjadi penolakan layanan yang ditimbulkan sendiri. Rantai sinkron yang dalam dan cerewet adalah musuh di sini, jadi jawabannya mungkin mendorong Anda ke alur asinkron atau lebih sedikit lompatan.
Kapan terakhir kali Anda menyuntikkan kegagalan yang diklaim desain Anda mampu bertahan, dan apa yang rusak yang tidak Anda duga? Pola ketahanan adalah hipotesis sampai Anda membuat sistem gagal dengan sengaja: matikan instans, tambah latensi pada dependensi, jatuhkan sebagian pesan, kirim ulang batch dua kali. Dalam sistem terdistribusi kegagalan yang menarik bersifat parsial dan intermiten, sehingga circuit breaker atau kompensasi saga yang tampak benar dalam kode tetap dapat berperilaku keliru di bawah timeout-yang-mungkin-selesai nyata. Bawa hasil game day atau eksekusi injeksi kegagalan yang sebenarnya, bukan dokumen desain, dan catat peringatan mana yang berbunyi, berapa lama pelacakan melokalisasi kesalahan, dan apakah ada badai retry yang terbentuk. Di sektor yang diatur, bukti bahwa Anda telah menguji kegagalan adalah bagian dari mendemonstrasikan ketahanan operasional kepada auditor. Jika Anda belum pernah menjalankannya, eksperimen pertama termasuk di lingkungan uji dengan radius ledakan ketat dan sakelar pembatalan.
Untuk setiap alur data utama, dapatkah tim pemiliknya menyebut model konsistensi yang disediakannya, dan apakah pilihan itu cocok dengan yang sebenarnya dibutuhkan bisnis? CAP dan PACELC memaksa pilihan yang disengaja per operasi, namun dalam organisasi besar bawaannya adalah penyimpangan: alur yang dimulai konsisten akhirnya untuk penghitung berpertaruhan rendah dipakai ulang untuk sesuatu yang kini menyetujui pembayaran atau memberi akses, dan tak seorang pun meninjau ulang jaminannya. Pertimbangan yang bersaing itu nyata, karena konsistensi kuat memakan ketersediaan selama partisi dan latensi bahkan ketika tidak ada, sementara konsistensi akhirnya membeli kecepatan dengan harga pembacaan basi dan resolusi konflik yang harus Anda rancang. Bawa katalog alur data teratas Anda, masing-masing berlabel model saat ini (kuat, kausal, baca-tulisan-sendiri, atau akhirnya) dan konsekuensi bisnis pembacaan basi atau hilang, lalu cari ketidakcocokan di mana jaminan lebih kuat atau lebih lemah daripada yang dibenarkan taruhannya. Dalam keuangan enterprise dan dalam sistem tunjangan atau identitas pemerintah, pembacaan konsisten akhirnya di balik keputusan berwenang adalah jenis cacat diam-diam yang muncul sebagai temuan audit atau penolakan tidak sah berbulan-bulan kemudian, sehingga tinjauan itu sendiri adalah bukti yang akan diminta ditunjukkan auditor.
Bagaimana transaksi bisnis multilayanan Anda berperilaku di tengah jalan, dan siapa yang bertanggung jawab atas kompensasi yang membatalkannya? Mengganti two-phase commit dengan saga berarti sistem melewati keadaan antara yang terlihat, dan satu langkah dapat berhasil sementara langkah berikutnya gagal dan memicu tindakan kompensasi yang membalikkannya. Bagi tim besar ini memunculkan pertanyaan kepemilikan yang sulit: rantai otorisasi-debit-kredit-buku besar sering melintasi beberapa tim, dan kompensasi yang dilupakan satu tim membuat uang atau catatan tidak konsisten secara permanen. Timbang koreografi, di mana layanan bereaksi terhadap peristiwa satu sama lain tanpa pengendali pusat dan alur sulit dilihat, terhadap orkestrasi, di mana koordinator menggerakkan dan memantau langkah dengan biaya komponen untuk dijalankan. Bawa diagram status untuk saga terpenting Anda, daftar tindakan kompensasi beserta pemiliknya, dan bukti bahwa keadaan “sedang berjalan” dan “dikompensasi” ditangani baik dalam pengalaman pengguna maupun jejak audit. Dalam perbankan dan manajemen kasus sektor publik, regulator mengharapkan Anda merekonstruksi persis apa yang terjadi pada transaksi yang gagal di tengah jalan, sehingga keadaan antara yang tak dimodelkan adalah celah kepatuhan, bukan sekadar bug.
Apakah konsumen pesan Anda bertahan dari pengiriman duplikat dan tertukar urutan, dan dapatkah Anda membuktikannya sebelum broker memaksa pertanyaannya? Pengiriman tepat-sekali adalah mitos, jadi jaminan nyata Anda adalah setidaknya-sekali, dan konsumen yang mengasumsikan setiap pesan tiba sekali dan berurutan akan memproses ganda pada hari broker mengirim ulang batch setelah failover. Di banyak tim risikonya berlipat, karena satu konsumen tidak idempoten pada aliran bersama dapat merusak status hilir yang diandalkan tim lain, dan kegagalan tak terlihat sampai pemutaran ulang atau partisi menukar urutan peristiwa. Trade-off-nya adalah biaya rekayasa kunci idempotensi, log pesan yang diproses, dan penanganan offset serta partisi eksplisit, terhadap biaya kerusakan diam-diam. Bawa daftar konsumen pada aliran kritis Anda, catat yang melakukan deduplikasi dan yang hanya berharap, dan bawa hasil uji pengiriman ulang atau pemutaran ulang yang sebenarnya alih-alih jaminan bahwa seharusnya baik-baik saja. Untuk pertukaran data antarlembaga pemerintah dan pipeline peristiwa enterprise, kemampuan memutar ulang aliran dengan aman setelah perbaikan bug, tanpa membuat kasus atau tagihan duplikat, adalah keharusan operasional sekaligus sesuatu yang ingin didemonstrasikan auditor.
Lensa sektor
Startup. Dengan dua atau tiga bagian yang bergerak dan tanpa tim platform, tahan diri dari membangun mesin terdistribusi yang tidak sanggup Anda isi stafnya. Beli ketahanan di tempat ia hidup dalam SDK yang sudah diberikan penyedia pembayaran atau pesan Anda, dan belanjakan perhatian langka Anda pada dua pola yang mencegah kerugian tak terbalikkan: kunci idempotensi pada setiap panggilan yang memindahkan uang atau mengubah akun, dan timeout dengan retry terbatas agar koneksi goyah tidak pernah bertindak ganda. Jaga jumlah lompatan jaringan kecil, karena setiap dependensi sinkron yang Anda tambah adalah satu hal lagi yang dapat gagal sebelum Anda punya orang on-call untuk menyadarinya.
Bisnis kecil. Anda kemungkinan tidak punya spesialis sistem terdistribusi dan anggaran ketat, jadi perlakukan ini sebagai pertanyaan beli-bukan-bangun: pilih antrean terkelola, basis data terkelola, dan platform yang menangani retry, pengurutan, dan deduplikasi untuk Anda daripada infrastruktur yang harus Anda operasikan. Bingkai risiko Anda dengan kata-kata sederhana, mengetahui operasi mana yang akan menyakiti pelanggan jika berjalan dua kali atau mengembalikan data basi, dan nyalakan fitur idempotensi dan setidaknya-sekali yang sudah ditawarkan vendor Anda. Hindari menyambung layanan lewat basis data bersama untuk memalsukan transaksi, karena itu diam-diam menciptakan ulang masalah terdistribusi tersulit tanpa perkakas untuk mengelolanya.
Enterprise. Masalah intinya adalah konsistensi di banyak tim, jadi kirim idempotensi, timeout, retry terbatas, circuit breaker, dan pelacakan berkorelasi sebagai bawaan platform bersama alih-alih membiarkan setiap kelompok meraciknya sendiri. Bakukan bagaimana model konsistensi dan jaminan pengiriman dideklarasikan per alur, jalankan injeksi kegagalan dan game day secara berkala, dan buat anggaran waktu total tersusun lintas rantai panggilan dalam agar satu layanan tidak dapat mencoba ulang platform ke dalam pemadaman. Kelola ketahanan sebagai kemampuan terukur dengan sasaran tingkat layanan pada gejala yang terlihat pengguna, karena pada skala Anda satu timeout yang hilang dapat berantai menjadi pemadaman berita utama.
Pemerintah. Sistem antarlembaga berarti tak seorang pun memiliki keseluruhan, jadi rancang untuk batas yang tidak Anda kendalikan: antrean tahan lama dengan pengiriman setidaknya-sekali, deduplikasi pada ID pesan yang stabil, dan ID korelasi yang mengalir melintasi garis lembaga untuk memberi auditor jejak ujung ke ujung. Aturan pengadaan dan transparansi mendorong Anda mendokumentasikan model konsistensi dan jaminan pengiriman setiap integrasi, dan menjaga keputusan berwenang (identitas, kelayakan, tunjangan) pada pembacaan konsisten kuat alih-alih endpoint ter-cache. Perlakukan bukti kegagalan yang teruji dan riwayat transaksi yang dapat direkonstruksi sebagai keluaran, karena ketahanan operasional dan akuntabilitas kepada publik adalah kewajiban kontraktual dan undang-undang, bukan kesopanan internal.
Contoh
Startup. Sebuah startup fintech kecil hanya punya dua bagian bergerak yang berbicara lewat jaringan: aplikasinya dan penyedia pembayaran pihak ketiga. Bahkan pada ukuran ini ia membuat setiap permintaan tagihan membawa kunci idempotensi dan membungkus panggilan dalam retry dengan backoff, sehingga respons yang jatuh pada koneksi goyah tidak pernah menagih pelanggan dua kali. Melewatkannya terasa murah pada hari pertama, tetapi tagihan ganda pertama yang mengenai pengguna nyata memakan kebakaran dukungan, pengembalian dana, dan goresan kepercayaan yang tidak sanggup ditanggung perusahaan muda itu.
Enterprise. Sebuah platform ride-sharing global memproses pembayaran perjalanan lewat saga: otorisasi kartu, debit penumpang, kredit pengemudi, catat entri buku besar, masing-masing transaksi lokal dengan pembalikan kompensasi. Setiap langkah membawa kunci idempotensi, sehingga retry setelah timeout jaringan tidak pernah menagih ganda. Panggilan ke layanan penilaian penipuan berada di balik circuit breaker; ketika ia merosot pada puncak, breaker terbuka dan perjalanan beralih ke skor konservatif alih-alih memblokir setiap perjalanan. Ketika pelanggan menyengketakan perjalanan, pelacakan terdistribusi memungkinkan insinyur mengikutinya melintasi selusin layanan dalam hitungan detik.
Pemerintah. Layanan identitas nasional dipakai banyak lembaga untuk verifikasi. Ia menawarkan pembacaan konsisten kuat untuk pemeriksaan status berwenang (Anda tidak boleh menyetujui tunjangan terhadap data identitas basi), ditambah endpoint ter-cache yang konsisten akhirnya untuk pencarian berlalu lintas tinggi dan non-kritis. Pertukaran data antarlembaga berjalan melalui antrean pesan tahan lama dengan pengiriman setidaknya-sekali, dan konsumen setiap lembaga melakukan deduplikasi pada ID pesan, sehingga catatan yang dikirim ulang tidak membuat kasus duplikat. ID korelasi mengalir melintasi batas lembaga, memberi auditor jejak ujung ke ujung tentang bagaimana data warga berpindah antardepartemen.
Kasus bisnis: motivasi, ROI, dan TCO
Disiplin sistem terdistribusi dibeli dengan murah dan ketiadaannya dibayar dengan katastrofik. Biaya adopsi adalah waktu rekayasa untuk membangun idempotensi, timeout, retry, circuit breaker, dan pelacakan ke dalam pustaka bersama dan bawaan platform. Itu investasi sederhana dan sebagian besar sekali jalan yang kemudian menguntungkan setiap tim. Biaya tidak mengadopsinya diukur dalam pemadaman besar: satu timeout yang hilang yang berantai menjadi pemadaman seluruh platform, jalur pembayaran tidak idempoten yang menagih ganda ribuan pelanggan, atau transaksi terdistribusi tanpa saga yang membiarkan data tidak konsisten secara permanen. Masing-masing adalah insiden berita utama dengan biaya pendapatan, perbaikan, dan reputasi langsung, dan di sektor yang diatur, denda.
Bingkai kasus kepada pimpinan di sekitar ketersediaan dan radius ledakan. Pola ketahanan langsung mengurangi frekuensi dan durasi insiden parah, metrik yang sudah dilacak eksekutif sebagai uptime dan mean-time-to-recovery. Observabilitas terdistribusi adalah tuas terbesar atas MTTR: tim dengan pelacakan berkorelasi menyelesaikan insiden lintas layanan dalam sebagian kecil waktunya. Karena kemampuan ini paling baik dikirim sebagai bawaan platform bersama, biaya marginal per timnya rendah dan imbal hasil seluruh organisasinya berlipat. Argumen TCO-nya sederhana: membangun ketahanan sejak awal adalah sebagian kecil dari biaya memasangnya belakangan setelah pemadaman yang memaksa persoalan.
Anti-pola dan jebakan
- Tanpa timeout. Satu dependensi menggantung menghabiskan setiap thread dan menjatuhkan seluruh sistem.
- Mencoba ulang operasi tidak idempoten. Efek samping duplikat: tagihan ganda, catatan duplikat, email ganda.
- Badai retry. Retry tersinkron tanpa backoff dan jitter yang memperkuat gangguan kecil menjadi pemadaman.
- Mengasumsikan pengiriman tepat-sekali. Membangun konsumen yang rusak pada pesan duplikat yang akhirnya akan dikirim broker.
- Transaksi terdistribusi lewat basis data bersama. Mengopel layanan lewat satu basis data untuk memalsukan ACID, menciptakan ulang monolit terdistribusi.
- Mengabaikan kegagalan parsial. Kode yang mengasumsikan panggilan jarak jauh sepenuhnya sukses atau sepenuhnya gagal, tanpa penanganan untuk “timeout tetapi mungkin selesai.”
- Tanpa ID korelasi. Men-debug insiden lintas layanan dengan men-grep log tak terkait di sepuluh mesin.
- Rantai panggilan sinkron yang cerewet. Graf dependensi sinkron yang dalam di mana satu lompatan lambat menghentikan seluruh permintaan.
Model kematangan
- Tingkat 1: Memulai. Panggilan jarak jauh diperlakukan seperti panggilan lokal. Timeout hilang atau naif, retry tidak ada atau ceroboh, dan kegagalan berantai di seluruh sistem. Tidak ada pandangan bersama tentang konsistensi atau pengiriman, dan men-debug insiden lintas layanan berarti menelusuri log per mesin setelah kejadian.
- Tingkat 2: Mengembangkan. Beberapa tim menambah timeout dan retry dasar dan sedikit idempotensi, tetapi praktik tidak konsisten dari layanan ke layanan. Log tersentralisasi namun tidak berkorelasi, sehingga melacak permintaan lintas lompatan bersifat manual. Transaksi terdistribusi diharapkan berfungsi alih-alih dimodelkan, dan jaminan konsistensi hidup di kepala insinyur individual.
- Tingkat 3: Membakukan. Idempotensi, retry terbatas, backoff dengan jitter, circuit breaker, dan bulkhead adalah standar di seluruh organisasi lewat pustaka bersama. Saga dengan tindakan kompensasi menangani transaksi multilayanan, pelacakan terdistribusi dengan ID korelasi sudah ada, dan setiap alur data utama mendokumentasikan model konsistensi dan jaminan pengirimannya. Aturan dituliskan dan ditegakkan di seluruh organisasi alih-alih diserahkan pada setiap tim.
- Tingkat 4: Mengelola. Ketahanan diukur terhadap garis dasar, bukan sekadar ada. Anda melacak tingkat galat, persentil latensi, kejenuhan, dan throughput per layanan dan dependensi, mengawasi rasio retry dan tingkat terbukanya circuit breaker, dan menetapkan sasaran tingkat layanan pada gejala yang terlihat pengguna. Anggaran waktu total diverifikasi tersusun lintas rantai panggilan, waktu rata-rata pemulihan untuk insiden lintas layanan adalah metrik yang dipantau, dan hasil injeksi kegagalan dan game day memberi makan angka yang menggerbangi setiap perubahan.
- Tingkat 5: Mengorkestrasi. Ketahanan adalah bawaan platform yang terus diperbaiki, terintegrasi di seluruh organisasi dan adaptif terhadap kondisi. Injeksi kegagalan berjalan rutin di produksi dengan radius ledakan ketat, sistem merosot dengan anggun secara desain, dan pilihan konsistensi serta pengiriman ditinjau ulang seiring bergesernya beban dan taruhan bisnis. Metrik dari Tingkat 4 menggerakkan respons otomatis dan evolusi arsitektural yang stabil, sehingga properti terdistribusi menjadi lebih kokoh setiap insiden alih-alih sekadar bertahan.
Gagasan untuk didiskusikan
- Operasi kritis Anda yang mana yang benar-benar idempoten hari ini, dan mana yang diam-diam tidak?
- Untuk setiap alur data utama, dapatkah tim Anda menyebut model konsistensi dan jaminan pengiriman dari ingatan?
- Di mana circuit breaker akan mencegah pemadaman berantai terakhir Anda?
- Berapa lama saat ini diperlukan untuk melacak satu permintaan yang gagal di semua layanan yang disentuhnya?
- “Transaksi terdistribusi” Anda yang mana yang sebenarnya bergantung pada keberuntungan, dan mana yang saga sejati dengan kompensasi?
- Jika broker pesan Anda mengirim ulang setiap pesan dua kali selama satu jam, apa yang akan rusak?
Poin-poin utama
- Asumsikan jaringan tidak andal dan kegagalan bersifat parsial; rancang setiap interaksi jarak jauh untuk kelambatan, kehilangan, duplikasi, dan pertukaran urutan.
- Putuskan konsistensi versus ketersediaan per operasi memakai CAP/PACELC; dokumentasikan model yang disediakan setiap alur.
- Idempotensi, timeout, retry terbatas, dan backoff-dengan-jitter adalah satu paket; jangan pernah mengadopsi retry tanpa tiga lainnya.
- Circuit breaker dan bulkhead menahan kegagalan; saga dengan kompensasi menggantikan transaksi terdistribusi yang tak dapat dijalankan.
- Perlakukan pengiriman sebagai setidaknya-sekali dan jadikan pemrosesan idempoten untuk mencapai efek tepat-sekali.
- Pelacakan, metrik, dan log berkorelasi adalah satu-satunya cara memahami dan mengoperasikan alur terdistribusi.
Referensi dan bacaan lanjutan
- Martin Kleppmann, Designing Data-Intensive Applications
- Andrew Tanenbaum dan Maarten van Steen, Distributed Systems: Principles and Paradigms
- Michael Nygard, Release It!: Design and Deploy Production-Ready Software
- Sam Newman, Building Microservices
- Chris Richardson, Microservices Patterns (saga, pesan transaksional)
- Eric Brewer, “CAP Twelve Years Later” dan Daniel Abadi tentang PACELC
- Leslie Lamport, “Time, Clocks, and the Ordering of Events in a Distributed System”
- Cindy Sridharan, Distributed Systems Observability
- Gagasan antifragility Nassim Nicholas Taleb (sebagaimana diterapkan literatur rekayasa ketahanan)