Pertanyaan dan konteks
Migrasi ini mengubah nama field sekaligus maknanya: total_cents mengasumsikan USD, sedangkan amount_minor harus bekerja dengan mata uang eksplisit. Alias Avro dapat membantu resolusi nama, tetapi tidak dapat membuktikan bahwa "cents" telah dimigrasikan dengan benar ke "minor currency units".
Hal yang dievaluasi pewawancara
- Memperluas pembaca (readers) sebelum produsen (producers) mengisi field baru.
- Memisahkan kompatibilitas struktural dari semantik jumlah nominal.
- Mempertahankan skema lama dan transformasi untuk replay 90 hari.
- Menghentikan penggunaan (retiring) berdasarkan bukti konsumen daripada tanggal kalender.
Klarifikasi sebelum menjawab
Konfirmasikan format, mode registry, perilaku field yang tidak dikenal, representasi jumlah nominal, ketersediaan mata uang, konsumen paling lambat, dan siklus replay. Tanyakan apakah topik v2 tersedia jika kedua makna tidak dapat direpresentasikan secara kompatibel.
Kerangka jawaban 30 detik
Tambahkan amount_minor dan currency opsional terlebih dahulu. Tingkatkan versi setiap konsumen untuk memprioritaskan field baru dan melakukan fallback ke total_cents, sambil memvalidasi kesamaan nilai untuk event USD. Kemudian isi secara ganda (dual-populate) pada produsen dan hentikan logika bisnis baru dari membaca field lama. Pertahankan skema historis dan transformasi melampaui 90 hari. Hapus field lama hanya setelah produsen berhenti menulisnya, konsumen dan dependensi offline berhenti membacanya, dan replay 90 hari penuh berhasil dilewati dengan skema baru.
Pembahasan mendalam langkah demi langkah
Fase satu bersifat aditif. Kompatibilitas registry dan matriks reader/writer di CI memblokir versi yang tidak valid. Konsumen mendapatkan dukungan pembacaan ganda (dual-read) sebelum produsen baru di-deploy.
Fase dua mengisi secara ganda. USD memerlukan amount_minor == total_cents dan currency == USD; event non-USD hanya mengisi semantik baru yang sebenarnya. Lacak cakupan, fallback, dan ketidaksesuaian berdasarkan versi produsen, konsumen, dan mata uang.
Fase tiga menghentikan ketergantungan bisnis pada field lama sambil tetap mempertahankan kemampuan replay. Komponen replayer memilih transformasi berdasarkan ID skema writer daripada menginterpretasikan riwayat dengan nilai default saat ini. Jika satu subject tidak dapat mengekspresikan kedua makna secara aman, gunakan topik v2 dan penerjemah eksplisit.
Hentikan penggunaan hanya setelah semua produsen menghentikan penulisan lama, fallback mencapai nol, seluruh jendela replay telah terlewati, dan pekerjaan offline telah diinventarisasi. Simpan skema rollback dan versi transformasi yang siap di-deploy.
Contoh jawaban yang kuat
Saya akan menggunakan pola expand-migrate-contract: tambahkan field dan tingkatkan versi pembaca, lakukan dual-write dan rekonsiliasi, lalu hentikan field lama hanya ketika bukti menunjukkan bahwa setiap dependensi telah meninggalkannya. Alias hanya menyelesaikan penamaan; semantik mata uang membutuhkan contract test dan runtime invariant.
Field lama dipertahankan selama satu jendela replay penuh. Jika penulisan ganda USD tidak cocok, bekukan peluncuran dan pertahankan total_cents sebagai sumber otoritatif untuk batch USD tersebut sementara produsen diperbaiki. Event non-USD harus mempertahankan amount_minor + currency sebagai sumber otoritatif; jeda penyerapan (ingestion) non-USD baru atau rutekan ke topik v2 daripada mengarang nilai sen. Setelah masa pensiun, kedua field baru menjadi runtime invariant yang wajib. Penghapusan kontrak dimulai hanya setelah jalur online, offline, dan replay telah ditutup.
Kesalahan umum
- Mengganti nama field dalam satu commit skema.
- Menganggap alias sebagai konversi jumlah nominal.
- Men-deploy produsen sebelum konsumen.
- Membaca data historis lama dengan mata uang default saat ini.
- Melewatkan konsumen offline dan konsumen replay.
Pertanyaan lanjutan
Mengapa alias saja tidak cukup?
Alias membantu menyelesaikan nama field; ini tidak membuktikan bahwa sen dan unit minor mata uang lain memiliki makna yang setara.
Kapan topik v2 diperlukan?
Ketika makna lama dan baru tidak dapat direpresentasikan secara jelas dan tanpa ambigu di bawah kontrak kompatibilitas yang disyaratkan.
Bagaimana jika penulisan ganda (dual writes) tidak cocok?
Untuk penulisan ganda USD, hentikan peluncuran, pertahankan total_cents sebagai sumber otoritatif untuk batch yang terpengaruh, isolasi berdasarkan versi produsen, perbaiki, dan lakukan replay. Untuk non-USD, pertahankan amount_minor + currency sebagai otoritatif dan jeda ingestion atau gunakan topik v2; jangan pernah melakukan fallback ke nilai sen rekaan.
Kapan field lama dapat dihapus?
Setelah penulisan lama berhenti, fallback bernilai nol, jendela replay penuh telah terlewati, dan inventarisasi offline sudah bersih.