English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

tamu
1 / ?
kembali ke pelajaran

Bentuk 1: Perbaikan Status. Bentuk 2: Laporan Boros.

Jantung Berwaktu berdetak berdasarkan jam. Bukan berdasarkan kebutuhan. Bukan berdasarkan perubahan. Berdasarkan timer.

Dua bentuk, satu akar masalah: pekerjaan terjadwal yang menggantikan desain yang benar.

Bentuk 1: Perbaikan Status

Transisi status gagal diselesaikan secara atomik. Alih-alih memperbaiki transisi tersebut, pekerjaan latar belakang berjalan dengan penundaan & melakukan rekonsiliasi. Pengguna melihat status rusak selama jendela rekonsiliasi.

Contoh GitHub (2026-04-08): Sebuah pull request dari repositori upstream berubah menjadi privat. GitHub mencoba melakukan transisi status: menutup PR, memperbarui status branch, dan menghapus status merge. Transisi tersebut tidak selesai secara atomik. Status PR menampilkan 'branch-forced-closed' & 'Merge status cannot be loaded' secara bersamaan. Sebuah pekerjaan latar belakang Sidekiq berjalan beberapa menit kemudian dan menyelesaikan rekonsiliasi. Pengamat melihat kondisi rusak selama jendela waktu tersebut.

The Metered Heart: pekerjaan Sidekiq berjalan sesuai jadwal. Ia tidak berjalan karena GitHub mendeteksi kondisi rusak; ia berjalan karena timer menyala. Seorang pengguna yang mengamati PR secara real-time melihat PR yang saling bertentangan hingga eksekusi pekerjaan berikutnya.

Form 2: Laporan yang Boros

Sebuah laporan atau agregasi menghitung ulang dari awal pada interval tetap. Tidak ada pemeriksaan cache. Tidak ada penjaga idempotensi. Tidak ada pembaruan inkremental. Setiap eksekusi: pemindaian penuh.

Contoh: pekerjaan cron malam hari yang menghitung ulang total jumlah pembelian setiap pengguna dengan memindai semua pesanan sejak awal waktu. Pekerjaan analitik harian yang membuat ulang dasbor dari log peristiwa mentah. Email ringkasan mingguan yang menanyakan setiap baris dalam tabel aktivitas.

Masing-masing berjalan terlepas dari apakah data berubah sejak eksekusi terakhir. Masing-masing memindai seluruh riwayat meskipun hanya 24 jam terakhir yang berisi data baru. Masing-masing menggantikan desain inkremental dengan pengulangan terjadwal.

Akar Bersama

A Metered Heart tidak dapat mengatakan kebenaran tentang kondisinya sendiri. Ia hanya mengetahui jam. Form 1: pekerjaan perbaikan status berjalan pada T+5 menit terlepas dari apakah status rusak pada T+0. Form 2: pekerjaan laporan berjalan pukul 2 pagi terlepas dari apakah ada data yang berubah sejak kemarin.

Jam tidak membawa informasi tentang apa yang perlu dilakukan. Sebuah event membawa informasi tersebut: 'transisi state baru saja gagal,' 'pesanan baru baru saja tiba.' Metered Heart membuang informasi itu & menggantinya dengan jadwal.

Capital Drain

Metered Heart menguras living capital: insinyur yang siap siaga untuk insiden state yang rusak. Mengikis kepercayaan sosial: pengguna melihat data yang tidak konsisten & melaporkan cacat yang kemudian hilang sendiri. Memperbesar MOAD lain: pekerjaan perbaikan state yang memindai semua record untuk menemukan state rusak sering mengandung MOAD-0001 (pemindaian O(N²)). Pekerjaan laporan yang menghitung ulang data dingin dapat memicu MOAD-0005 (cache stampede). MOAD-0009 memperburuk cacat lain.

The Shared Root

Form 1 & Form 2 tampak berbeda di permukaan: satu memperbaiki state, satu menghitung ulang data. Penyebab akar menghubungkan keduanya.

Form 1 dan Form 2 berbagi penyebab akar. Jelaskan dalam satu kalimat. Kemudian berikan contoh masing-masing form dari perangkat lunak yang pernah Anda gunakan.

Fire on Change, Not on Clock

Desain berbasis peristiwa (event-driven) aktif ketika sesuatu berubah. Perubahan status adalah peristiwa. Peristiwa adalah pemicu.

Form 1: transisi atomik menggantikan pekerjaan perbaikan.

Jika transisi status dapat meninggalkan sistem dalam keadaan perantara yang rusak, cacat tersebut berada pada transisi, bukan pada ketiadaan pekerjaan perbaikan. Perbaiki transisi agar selesai secara atomik (atau transaksional). Ketika transisi selesai secara atomik, keadaan rusak tidak pernah ada. Pekerjaan perbaikan tidak memiliki apa pun untuk diperbaiki.

# DEFECT: transisi non-atomik meninggalkan keadaan rusak
def close_pr_on_repo_private(pr_id):
pr = PR.get(pr_id)
pr.status = 'branch-forced-closed'   # langkah 1: status parsial
pr.save()                             # terlihat oleh pengguna SEKARANG
# ... langkah lain mungkin gagal ...
pr.merge_status = 'not_applicable'
pr.save()                             # langkah 2: sekarang konsisten
# Sidekiq job akan merekonsiliasi jika langkah 2 gagal
# PERBAIKAN: transisi atomik; tidak ada status perantara yang terlihat
def close_pr_on_repo_private(pr_id):
with db.transaction():
pr = PR.get(pr_id)
pr.status = 'branch-forced-closed'
pr.merge_status = 'not_applicable'
pr.save()   # kedua field commit secara atomik; tidak pernah setengah-tertulis

Form 2: pembaruan inkremental menggantikan komputasi ulang penuh.

Sebuah laporan yang menghitung ulang dari awal dipicu karena data lama + data baru = hasil baru. Namun hasil lama + delta = hasil baru yang sama, dihitung secara inkremental. Event: data baru tiba. Pemicu: perbarui agregat hanya untuk data baru tersebut.

# DEFECT: komputasi ulang penuh berdasarkan jadwal
def nightly_totals_job():
for user in all_users():
total = sum(o.amount for o in user.orders)  # pindai seluruh waktu
user.total_purchases = total
user.save()

# PERBAIKAN: pembaruan inkremental berbasis event
def on_order_placed(order):
order.user.total_purchases += order.amount   # hanya delta
order.user.save()

Pembaruan inkremental dijalankan saat pesanan tiba, bukan pukul 02.00. Ia hanya memperbarui pengguna yang terdampak. Ia hanya membaca pesanan baru, bukan seluruh pesanan dari waktu ke waktu. Pekerjaan malam pun hilang.

Mengapa Form 1 Mengungkap Transisi yang Rusak

Form 1 Metered Heart mengungkapkan bahwa transisi status dibiarkan tidak selesai. Pekerjaan perbaikan ada karena seorang insinyur melihat status yang rusak dan menambahkan mekanisme rekonsiliasi alih-alih memperbaiki transisi itu. Pekerjaan perbaikan: tambalan atas keputusan arsitektur yang rusak.

MOAD-0009 sebagai Penguat

MOAD-0009 memperkuat MOAD lain. Pekerjaan perbaikan status yang memindai semua catatan untuk menemukan status rusak: MOAD-0001 (pemindaian O(N) atau O(N²) per eksekusi pekerjaan). Pekerjaan laporan yang menghitung ulang semuanya dari awal: MOAD-0005 (cache stampede saat pekerjaan dimulai dan mengenai upstream yang hangat). MOAD-0009 tidak hanya merugikan sendiri; ia menghadirkan MOAD lain secara terjadwal.

Diagnosa & Rancang Ulang

Sebuah tim menjalankan cron job harian pukul 02.00. Job ini memindai semua pesanan dari semua pengguna dan menghitung ulang total pembelian setiap pengguna dari awal. Job ini memakan waktu 4 jam. Pukul 06.00, dasbor menampilkan total yang baru. Antara pukul 02.00 dan 06.00, dasbor menampilkan total kemarin.

Bentuk MOAD-0009 yang mana ini? Event apa yang harus memicu perhitungan ulang? Struktur data perantara apa yang membuat pembaruan menjadi inkremental?