Mengapa Analytics Tidak Boleh Menjatuhkan Website

Kasus sederhana: setiap page load memanggil track_page_view(). Ketika tabel page_views hilang, exception database tidak ditangkap dan seluruh website gagal. Halaman sebenarnya sehat; fitur sekunder membuatnya tidak tersedia.
Critical path vs optional path#
Critical path meliputi routing, otorisasi, mengambil content, dan menghasilkan respons. Analytics, audit non-keamanan, recommendation, dan counter biasanya optional. Kegagalan optional path harus terisolasi.
Perbaikan minimum: fail-open terukur#
function track_page_view(PDO $db, string $path): void
{
try {
$stmt = $db->prepare(
'INSERT INTO page_views(page_path, ip_hash) VALUES (?, ?)'
);
$stmt->execute([$path, privacy_safe_ip_hash()]);
} catch (Throwable $e) {
error_log('[analytics] dropped page view: ' . $e->getCode());
// Jangan melempar kembali exception ke request pengguna.
}
}
Jangan log data sensitif atau pesan database mentah ke output pengguna. Tambahkan counter internal agar kegagalan tidak diam-diam berlangsung berbulan-bulan.
Desain lebih kuat: outbox atau queue#
Browser request → Render page → Emit event → Queue/buffer → Analytics worker → Store
Request tidak menunggu database analytics. Worker dapat batch insert, retry dengan backoff, dan masuk dead-letter queue bila event terus gagal.
Failure budget#
| Kondisi | Respons halaman | Analytics |
|---|---|---|
| Tabel tersedia | 200 | Tersimpan |
| Tabel hilang | 200 | Dropped + alert |
| Queue penuh | 200 | Sample/drop terukur |
| Database utama mati | 503 | Tidak relevan |
Privasi sejak desain#
Kumpulkan hanya yang dibutuhkan. Hash IP dengan secret yang dirotasi, truncation bila cukup, retention pendek, dan jangan menganggap hash tanpa secret sebagai anonimisasi. Hindari menyimpan URL query yang mungkin mengandung token/email.
Pengujian yang membuktikan isolasi#
- Rename tabel analytics di database test.
- Request homepage.
- Pastikan status tetap 200 dan content lengkap.
- Pastikan satu metric/log kegagalan dibuat.
- Pulihkan tabel dan pastikan tracking kembali tanpa restart.
Aturan arsitektur: jika bisnis tetap dapat melayani user tanpa sebuah fitur, fitur itu tidak boleh menjadi single point of failure pada request path.
Sampling dan backpressure#
Ketika buffer mendekati kapasitas, jangan membiarkan memory tumbuh tanpa batas. Terapkan sampling, batas queue, dan drop counter. Page views dapat disampling; security audit events biasanya tidak boleh diperlakukan sama. Klasifikasikan event berdasarkan kebutuhan durability.
Data contract event#
{
"event": "page_view",
"schema_version": 1,
"occurred_at": "2026-08-11T13:04:22+07:00",
"path": "/blog/example",
"request_id": "req_...",
"visitor_bucket": "rotating-hash"
}
Schema version mencegah worker lama salah membaca producer baru. Validasi panjang path dan hapus parameter sensitif sebelum event keluar dari request.
SLO terpisah#
Website dapat memiliki availability 99,9%, sedangkan analytics delivery 99%. Jangan menyatukan keduanya. Alert analytics ketika drop rate melewati budget, tetapi jangan otomatis mematikan halaman publik.
Pertanyaan desain#
Apa yang terjadi bila analytics database lambat 30 detik? Jawaban yang baik: request user tetap selesai cepat, event masuk buffer atau di-drop terukur, operator mendapat alert, dan tidak ada retry storm.
💬 Comments (0)
No comments yet. Be the first to share your thoughts!