Penulisan lintas wilayah: di mana commit sebenarnya mendarat?
Perutean membawa permintaan ke sebuah wilayah; hanya batas transaksi yang membuat penulisan bersifat atomik. Sebutkan invariannya, pilih pemiliknya, lalu rancang percobaan ulang di sekitarnya.
Dua server aplikasi di dua wilayah, satu klien yang menulis melalui VPN, dan sebuah pertanyaan yang tak ditulis siapa pun: komponen mana yang memutuskan bahwa penulisan itu terjadi? Perutean membawa permintaan ke sebuah proses. Batas transaksi memutuskan kapan perubahan menjadi permanen dan terlihat. Itu adalah pekerjaan berbeda yang dilakukan sistem berbeda, dan celah di antaranya adalah tempat sebagian besar bug penulisan lintas wilayah hidup.
Mulai dari aturan bisnis, bukan dari peta
Mulailah dengan kalimat tentang aturan bisnis, bukan tentang geografi: pembacaan dan penulisan mana yang harus berhasil bersama, dan perubahan bersamaan mana yang harus mustahil selama itu terjadi. Untuk reservasi inventaris, itu berarti pemeriksaan stok dan reservasi keduanya berlaku atau tidak sama sekali, dan tidak ada pesanan kedua yang boleh menghabiskan unit yang sama di antaranya.
| Requirement | What satisfies it | What does not |
|---|---|---|
| All-or-nothing application | A transaction inside one owning system | A VPN path between regions |
| No double spend | Isolation strong enough to exclude the conflict | Atomicity alone |
| Survive a region loss | Replication the database itself documents | Two independent databases behind one client |
Baris tengah itulah yang dilewati tim. Atomisitas tanpa isolasi yang memadai memungkinkan dua transaksi masing-masing commit dengan benar dan tetap menghasilkan keadaan yang dianggap mustahil oleh bisnis, dan tidak ada jumlah logika percobaan ulang yang memperbaikinya setelahnya.
Satu batas berwenang mengalahkan dua server regional
Server aplikasi regional boleh tetap di tempatnya, asalkan mereka menyerahkan operasi ke layanan yang menjalankannya di dalam satu batas transaksi yang didukung. Lapisan aplikasi menjadi perute niat; lapisan data memiliki kebenarannya.
Jaga batas itu singkat dan dekat dengan data yang disentuhnya. Transaksi yang dibiarkan terbuka saat manusia menjawab prompt, atau saat panggilan melintasi dua wilayah, menghabiskan waktunya menahan kunci dan meningkatkan peluang sesuatu yang lain kehabisan waktu di belakangnya. Kegagalan itu tampak seperti masalah basis data dan sebenarnya masalah desain yang memakai kostum itu. Memindahkan keputusan ke lapisan data biasanya menghilangkannya sepenuhnya.
BEGIN;
UPDATE inventory SET reserved = reserved + 1
WHERE sku = 'A-100' AND available >= 1;
INSERT INTO reservation (sku, order_id) VALUES ('A-100', 'ord-9f');
COMMIT;
Bacalah sketsa itu sebagai batas, bukan sebagai rekomendasi kinerja. Intinya adalah pemeriksaan dan penyisipan berbagi satu commit, sehingga pesanan bersamaan entah melihat stok terpakai atau tidak melihatnya sama sekali.
Apa yang diberikan dan tidak diberikan basis data yang direplikasi
Basis data yang direplikasi dapat menyediakan batas yang lebih luas ketika model transaksinya sendiri mendukungnya. Spanner mendokumentasikan transaksi baca-tulis atomik dalam satu basis data lintas tabel, dengan isolasi dan perilaku percobaan ulang yang ditetapkan. Itu adalah jaminan yang Anda baca, uji, dan andalkan dengan sengaja.
Itu juga jaminan yang berasal dari produk, bukan dari rute. VPN antarwilayah mengubah cara paket melakukan perjalanan dan cara kegagalan menampilkan diri. Itu tidak memperluas batas transaksi satu baris pun, seberapa sehat pun terowongan itu terlihat. Mencampuradukkan keduanya menghasilkan arsitektur di mana setiap komponen lolos pemeriksaannya sendiri dan data tetap tidak sepakat.
Dua basis data tidak menjadi satu sistem
Dua basis data yang dikelola secara independen tidak memperoleh manajer transaksi bersama hanya karena klien dapat menjangkau keduanya. Jika bisnis benar-benar membutuhkan komitmen atomik di atas pasangan itu, mekanisme koordinasi, para peserta, dan proses pemulihan semuanya harus dipilih dan dikualifikasi, bukan diasumsikan.
Pikirkan saat peserta atau tautan menghilang setelah pekerjaan disiapkan. Commit terdistribusi yang didukung dapat meninggalkan keadaan ragu yang membutuhkan prosedur pemulihan dan keputusan manusia, dan itu datang tanpa janji bahwa setiap wilayah tetap dapat ditulis melalui setiap partisi.
Jika koordinasi asinkron justru dapat diterima, katakan itu secara eksplisit dan tuliskan keadaan bisnis perantara beserta aturan rekonsiliasinya. Rangkaian langkah yang di-commit secara lokal dengan kompensasi adalah desain yang sah; itu hanya bukan satu transaksi atomik dengan nama lain.
Rancang percobaan ulang sebelum gangguan pertama
Klien dapat kehilangan respons setelah operasi di-commit, jadi pemanggil tidak dapat menganggap waktu habis sebagai kegagalan. Pertahankan identitas permintaan yang tahan lama dan gunakan hasil layanan atau mekanisme idempotensi sebelum mencoba ulang mutasi, jika tidak percobaan ulang menjadi penulisan kedua.
Panggilan balik transaksi otomatis juga dapat berjalan lebih dari sekali setelah pembatalan yang dapat dicoba ulang, yang menjadikannya tempat buruk untuk efek eksternal yang tak dapat dibalik. Jauhkan itu di luar panggilan balik kecuali alur kerja menetapkan protokol aman eksplisit untuknya. Kehati-hatian yang sama berlaku untuk apa pun yang memakan biaya atau mengirim pesan. Tagihan ganda adalah percakapan yang jauh lebih sulit daripada baris log ganda.
Penerimaan harus memutar ulang empat skenario: dua klien berlomba untuk baris yang sama, pembatalan yang menurut layanan dapat dicoba ulang, commit yang jawabannya tidak pernah tiba, dan hilangnya wilayah atau tautan di antaranya. Catat hasil bisnis yang di-commit dan keadaan yang belum terselesaikan di samping desain perutean, agar tidak ada yang salah mengira jaringan sebagai komponen yang memberikan jaminan.