Episode 35 membangun layanan GraphQL yang resilient: desain high availability dengan multi-region dan failover, strategi backup dengan point-in-time recovery, perencanaan disaster recovery dengan RTO dan RPO, circuit breaker pattern, hingga graceful degradation dengan feature flags.

Downtime bukanlah "jika" tapi "kapan". Episode 35 membangun layanan GraphQL yang resilient — mampu bertahan dari kegagalan database, provider, bahkan seluruh region. Tujuan utamanya bukan menghindari kegagalan, tapi memastikan dampaknya seminimal mungkin.
Kita akan membahas high availability, strategi backup, perencanaan disaster recovery, circuit breaker, dan graceful degradation.
High availability (HA) berarti layanan tetap tersedia meski ada kegagalan. Desain utamanya:
region-a (primer) <--> region-b (sekunder)
| |
traffic standbyUntuk GraphQL yang stateless (episode 34), menambah region relatif mudah: deploy image yang sama, arahkan DNS, dan pastikan Redis serta database ter-replikasi lintas region.
Gabungkan liveness dan readiness (episode 24) dengan redundansi: database dengan replica yang bisa dipromosikan, Redis cluster yang bisa bertahan kehilangan node, dan strategi cache yang tidak membuat layanan berhenti saat Redis turun (fallback ke database langsung).
Backup yang benar bukan sekadar salinan — harus bisa memulihkan dengan cepat:
Backup PostgreSQL manual dilakukan dengan pg_dump -Fc database-name > backup.dump.
Untuk database terkelola (RDS, Cloud SQL), aktifkan automated backup dengan PITR bawaan.
DR plan diukur dengan dua metrik:
RTO: seberapa cepat kembali normal
RPO: seberapa banyak data yang boleh hilangSemakin kecil RTO dan RPO, semakin mahal infrastrukturnya. Tentukan target realistis sesuai bisnis, lalu rancang strategi (misalnya multi-region aktif-pasif untuk RTO rendah, backup harian untuk data non-kritis).
DR plan yang baik wajib didokumentasikan dan diuji berkala. Jadwalkan drill DR: matikan region primer, paksa failover, ukur waktu pemulihan, dan bandingkan dengan target RTO/RPO. Dari hasil drill, perbarui runbook dan otomasi.
Circuit breaker mencegah satu kegagalan menyebar. Konsepnya tiga status:
class CircuitBreaker {
constructor(fn, { threshold = 5, cooldownMs = 30000 }) {
this.fn = fn;
this.failures = 0;
this.threshold = threshold;
this.cooldownMs = cooldownMs;
this.lastFailure = 0;
this.state = "CLOSED";
}
async call(...args) {
if (this.state === "OPEN" && Date.now() - this.lastFailure < this.cooldownMs) {
throw new Error("Circuit terbuka: dependency sedang bermasalah");
}
try {
const result = await this.fn(...args);
this.failures = 0;
this.state = "CLOSED";
return result;
} catch (err) {
this.failures += 1;
this.lastFailure = Date.now();
if (this.failures >= this.threshold) this.state = "OPEN";
throw err;
}
}
}Pakai library seperti opossum untuk implementasi production-ready. Terapkan circuit breaker pada dependency eksternal: payment gateway, email service, dan third-party API. Lengkapi dengan fallback — misalnya mengembalikan data cache saat dependency turun.
Graceful degradation berarti layanan tetap berfungsi (dengan kualitas menurun) saat sebagian komponen gagal:
async function getTrending(ctx) {
try {
const data = await ctx.trendingService.fetch();
await ctx.redis.set("trending", JSON.stringify(data), "EX", 300);
return data;
} catch {
const cached = await ctx.redis.get("trending");
return cached ? JSON.parse(cached) : [];
}
}Pola fallback ini menjaga API tetap merespons walau source utama bermasalah — jauh lebih baik daripada error 500 total.
Inti yang harus dibawa pulang:
Di episode 36 selanjutnya kalian akan mempelajari GraphQL dengan microservices — pola gateway untuk microservices, federation deep dive, arsitektur event-driven dengan event sourcing dan CQRS, message broker seperti Kafka dan RabbitMQ, hingga service discovery. Arsitektur kalian akan berskala enterprise!