Renewal Lease Memerlukan Margin Aman Sebelum Kedaluwarsa
Lease memberi holder otoritas sementara sampai waktu kedaluwarsa yang tercatat. Otoritas itu harus diperpanjang melalui renewal sebelum batas waktunya. Menjadwalkan renewal tepat pada batas tersebut tidak menyisakan ruang untuk delay jaringan, jeda scheduler, latency storage, atau retry sementara.
Desain yang lebih aman mencoba renewal lebih awal. Interval antara renewal yang direncanakan dan kedaluwarsa menjadi margin aman: waktu yang disediakan untuk ketidakpastian normal sebelum lease dianggap hilang.
Renewal dan kedaluwarsa adalah dua batas berbeda
Misalkan sebuah lease berlaku selama 30 detik. Holder yang menunggu sampai detik ke-30 untuk melakukan renewal bergantung pada delay yang nyaris nol di setiap komponen pada jalur renewal.
0s 20s 30s
|----------------------|---------------|
lease acquired renew expiry
|<-- margin -->|Dengan target renewal pada detik ke-20, sisa 10 detik dapat menampung request yang terlambat atau retry terbatas. Angka tersebut hanya ilustrasi, bukan aturan universal. Besar margin harus sesuai dengan karakteristik waktu dan failure budget sistem yang sebenarnya.
Perbedaan semantiknya penting. Target renewal adalah deadline operasional yang dipilih client. Kedaluwarsa lease adalah batas otoritas yang ditegakkan protokol lease. Gagal memenuhi batas pertama harus memicu proses pemulihan; melewati batas kedua berarti holder tidak boleh lagi menganggap lease masih valid.
Timer lokal bukan otoritas lease
Sebuah proses sering memakai timer monotonik lokal untuk menentukan waktu pengiriman renewal. Timer tersebut berguna untuk penjadwalan, tetapi tidak memperpanjang lease dengan sendirinya.
Waktu kedaluwarsa yang otoritatif berada pada sistem yang memberikan dan memperpanjang lease. Client tidak dapat membuat lease yang sudah kedaluwarsa menjadi valid hanya dengan mereset timer lokal setelah mengirim request. Renewal baru efektif sesuai semantik keberhasilan yang ditetapkan protokol.
Asumsi clock harus dinyatakan secara eksplisit. Jika protokol membandingkan timestamp wall clock antar-mesin, clock skew ikut masuk ke perhitungan margin aman. Desain dengan expiry di sisi server atau durasi relatif dapat mengurangi sebagian asumsi clock lintas host, tetapi tetap menghadapi delay pesan dan pemrosesan.
Latency renewal memerlukan budget
Margin aman perlu mencakup lebih dari round-trip time jaringan yang lazim. Jalur renewal dapat melibatkan resolusi DNS, pembuatan koneksi, antrean proxy, pemrosesan service, consensus atau operasi storage, serta pengiriman response. Holder sendiri dapat tertunda akibat jeda runtime atau kekurangan waktu CPU.
Budget yang berguna mempertimbangkan latency renewal pada persentil tinggi ditambah ruang untuk sejumlah kecil retry. Jika satu percobaan dapat menghabiskan seluruh margin, mekanisme retry tidak memiliki ruang nyata untuk bekerja.
margin >= attempt budget + retry delay + final attempt budgetEkspresi ini adalah batas perencanaan, bukan jaminan. Latency dapat melampaui batas apa pun yang dipilih. Protokol tetap memerlukan tindakan yang tegas saat margin habis.
Jitter dapat menyebarkan traffic renewal ketika banyak lease diperoleh pada waktu berdekatan. Tanpanya, durasi lease yang sama dapat membentuk lonjakan renewal periodik yang meningkatkan latency yang hendak ditampung oleh margin tersebut.
Kegagalan renewal harus mengubah perilaku holder
Error saat renewal tidak selalu berarti lease sudah kedaluwarsa. Sebuah request dapat gagal ketika waktu lease yang dapat dipakai masih tersisa. Holder dapat melakukan retry di dalam marginnya jika error bersifat sementara dan budget yang tersisa masih cukup untuk percobaan berikutnya.
Holder harus menghentikan pekerjaan yang memerlukan otoritas ketika validitas lease tidak lagi dapat dipastikan. Terus bekerja tanpa batas setelah renewal gagal mengubah mekanisme otoritas berbatas waktu menjadi optimistic lock tanpa batas yang dapat diandalkan.
Cancellation perlu diteruskan ke pekerjaan yang bergantung pada lease. Operasi panjang memerlukan sisa waktu lease yang cukup untuk selesai dengan aman, atau memerlukan protokol yang kembali memvalidasi otoritas pada batas resource.
Untuk write ke resource eksternal, lease saja mungkin tidak dapat menolak holder lama yang terlambat. Fencing token atau pemeriksaan generation monotonik lain memungkinkan resource menolak operasi dari generation lease lama setelah holder baru mengambil alih.
Kebijakan retry harus muat dalam waktu yang tersisa
Middleware retry generik dapat berbahaya untuk renewal lease jika mengabaikan deadline lease. Exponential backoff yang menjadwalkan percobaan berikutnya setelah kedaluwarsa tidak memberi manfaat, dan request timeout yang lebih panjang daripada sisa waktu lease dapat menyembunyikan transisi menuju holder yang tidak valid.
Setiap percobaan perlu dibatasi oleh waktu yang masih tersedia. Sebelum retry berikutnya, client dapat memeriksa apakah margin masih cukup untuk percobaan dan pemrosesan response yang diharapkan.
Retry juga memerlukan klasifikasi error. Kegagalan autentikasi, generation yang ditolak, atau response yang menyatakan lease bukan lagi milik holder ini tidak boleh diperlakukan seperti transport timeout sementara.
Status akhirnya harus eksplisit: berhasil diperpanjang, pasti hilang, atau belum pasti sampai batas kedaluwarsa memaksa holder berhenti. Menganggap ketidakpastian sebagai keberhasilan merusak kontrak lease.
State renewal memerlukan invariant yang tahan terhadap concurrency
Beberapa loop renewal dapat muncul bersamaan setelah proses berhenti sejenak, worker restart, atau event penjadwalan terduplikasi. Dua loop tidak boleh memajukan state lokal secara independen sehingga response lama menimpa state yang lebih baru.
Generation number atau update compare-and-set dapat mengikat response renewal dengan state lease yang memulainya. Transisi state perlu mempertahankan expiry terbaru yang diterima dan menolak response untuk generation lease yang sudah usang.
Jika renewal juga mengembalikan fencing token baru, holder harus memublikasikan token tersebut secara atomik bersama state lease yang telah diperpanjang sebelum pekerjaan yang bergantung padanya menggunakannya. Update state parsial menciptakan celah antara otoritas yang direpresentasikan secara lokal dan otoritas yang ditegakkan resource.
Observability perlu berfokus pada margin yang tersisa
Jumlah renewal yang berhasil dapat tetap tinggi sementara sistem beroperasi terlalu dekat dengan kedaluwarsa. Sinyal yang lebih berguna adalah jumlah waktu lease yang masih tersisa ketika renewal berhasil.
Metrik yang berguna mencakup latency percobaan renewal, jumlah keberhasilan dan kegagalan, retry per renewal, sisa waktu saat berhasil, lease yang hilang setelah kegagalan renewal, serta request renewal yang ditolak karena holder atau generation berubah.
Distribusi sisa waktu yang terus menurun dapat menunjukkan congestion sebelum lease mulai kedaluwarsa. Sinyal ini juga dapat menampakkan jeda scheduler atau traffic renewal yang tersinkronisasi dan tidak terlihat pada latency request rata-rata.
Log sebaiknya membawa identifier lease, generation, expiry sebelumnya, expiry baru yang diterima, serta kelas error jika nilai tersebut aman untuk dicatat. Konteks itu membedakan renewal lambat yang berhasil dari holder usang yang mencoba memperpanjang generation lama.
Margin adalah bagian dari desain lease
Durasi lease saja tidak membentuk kebijakan renewal yang kuat. Holder juga memerlukan titik renewal yang direncanakan, percobaan berbatas, perilaku retry yang muat dalam interval tersisa, serta transisi tegas ketika otoritas tidak lagi dapat dipastikan.
Margin aman memberi mekanisme tersebut waktu untuk bekerja sebelum kedaluwarsa. Margin tidak membuat kegagalan timing menjadi mustahil; fungsinya membuat delay yang ditoleransi menjadi eksplisit dan memisahkan batas otoritas yang keras dari jadwal renewal pilihan client.