Materi ini menggabungkan tiga topik yang saling terkait erat: system reliability, arsitektur scalable, dan system design. Reliability (keandalan sistem tetap berjalan meski ada failure) dan scalability (kemampuan menangani pertumbuhan beban) adalah dua fondasi yang selalu muncul bersamaan saat mendesain sistem terdistribusi skala besar — dan keduanya dipraktikkan langsung lewat studi kasus system design (evolusi arsitektur sebuah web service dari melayani ribuan hingga ratusan ribu pengguna). Topik ini sangat relevan untuk capaian memahami reliabilitas, konsistensi, dan skalabilitas sistem terdistribusi.

System Reliability

Reliability vs Resilience

  • Reliability: kualitas untuk dapat dipercaya (trustworthy) atau bekerja secara konsisten baik dari waktu ke waktu.
  • Resilience: kapasitas untuk pulih dengan cepat dari kesulitan; ketangguhan, kemampuan sebuah sistem untuk “kembali ke bentuk semula” setelah mengalami gangguan.

Service Reliability Hierarchy

Konsep ini diadaptasi dari Google SRE Book (Mikey Dickerson), digambarkan sebagai piramida kebutuhan reliability dari fondasi ke puncak: Monitoring → Incident Response → Postmortem/Root Cause Analysis → Testing + Release Procedures → Capacity Planning → Development → Product.

Penjelasan tiap lapisan:

  • Monitoring: tanpa monitoring, tidak mungkin diketahui apakah sebuah service berjalan normal atau tidak. Di dalamnya ada Alerting, yaitu mekanisme notifikasi otomatis jika ada masalah.
  • Incident Response: penanganan incident yang tepat akan meningkatkan reliability. Mencakup effective troubleshooting, emergency response (“jangan panik”), dan incident management dengan prioritas: resolve problem → restore service → cari root cause. Perlu disiapkan (prepare) dan didokumentasikan incident handling procedure sejak awal.
  • Postmortem/Root Cause Analysis: pembelajaran pasca-insiden.
  • Testing + Release Procedures: memastikan perubahan tidak merusak sistem.
  • Capacity Planning: memastikan resource cukup untuk menjalankan service.
  • Development: penanganan critical state seperti distributed consensus.

Incident Response & Emergency Response

Proses troubleshooting umum mengikuti alur: Problem Report → Triage → Examine → Diagnose → Test/Treat → Cure (dengan kemungkinan re-triaging jika situasi berubah).

Prinsip emergency response:

  • Things break, that’s life — kegagalan adalah hal yang wajar terjadi pada sistem.
  • Reaksi yang tepat: jangan panik, sadari “langit tidak sedang runtuh”, fokus mitigate → troubleshoot → fix, dan minta bantuan orang lain jika diperlukan.
  • Incident thresholds untuk menentukan kapan sebuah insiden harus dideklarasikan secara resmi: signifikan SLO degradation, ukuran data loss, dan jumlah customer yang meninggalkan layanan.

Incident handling pada sistem produksi memerlukan:

  • Rotasi jadwal engineer yang bertanggung jawab menangani incident pada periode tertentu (on-call rotation), agar penanganan tidak bergantung pada satu orang saja.
  • Setiap alert yang muncul perlu memiliki playbook penanganan yang menjadi panduan bagi engineer on-call berikutnya.
  • Incident/ticket/alert dikategorikan berdasarkan prioritas: P1 (ditangani segera), P2 (ditangani di hari kerja berikutnya), P3 (bersifat informasional saja).

Elements of Incident Handling menekankan recursive separation of responsibilities — pembagian peran yang jelas membuat setiap orang tahu ruang otonominya tanpa perlu menebak tindak lanjut kolega lain:

  • Incident Command: bertindak sebagai high-level commander untuk insiden.
  • Operational Work: yang melakukan perubahan langsung terhadap sistem.
  • Communication: yang berkomunikasi dengan pihak eksternal.
  • Planning: mendukung tim operasional untuk isu jangka panjang.

Elemen pendukung lain: Recognized Command Post, Live Incident State Document, dan Clear, Live Handoff antar shift.

Best Practices Incident Management: Prioritize (stop the bleeding → restore service → preserve evidence), Prepare (dokumentasikan prosedur di muka), Trust (beri otonomi penuh sesuai peran masing-masing), Introspect (sadari kondisi emosi sendiri, minta bantuan jika mulai panik/kewalahan), Consider alternatives (evaluasi ulang pendekatan secara berkala), Practice (latih proses secara rutin agar jadi kebiasaan), dan Change it around (bergantian peran agar semua anggota tim familiar dengan tiap peran).

Postmortem Culture

“The cost of failure is education.”

Setiap sistem pasti akan mengalami kegagalan. Saat terjadi outage, kejadian tersebut harus dimanfaatkan sebagai kesempatan belajar untuk mengembangkan langkah tindak lanjut yang mencegah masalah serupa terulang.

Postmortem adalah catatan tertulis yang menjelaskan sebuah insiden: dampaknya, penyebabnya, urutan kejadian, root cause, langkah pencegahan/penanganan, dan tindak lanjutnya. Agar efektif, budaya blameless postmortem harus diterapkan — goal-nya adalah perbaikan sistem, bukan mencari siapa yang salah.

Blameless Postmortem dilandasi alasan berikut:

  • Pada sistem berskala besar (baik dari ukuran kode, jumlah engineer, maupun jumlah komponen), pasti akan ada bagian yang mengalami error/break — ini keniscayaan, bukan pengecualian.
  • Engineer seharusnya tidak takut dihukum akibat outage; ketakutan seperti itu menimbulkan perasaan unsafe terhadap pekerjaan dan membuat orang menghindari pengambilan risiko yang justru terkontrol dan diperlukan.
  • Fokus lebih baik diarahkan pada memahami root cause (misalnya dengan teknik 5 Whys) dan menyusun action plan pencegahan, tanpa mengindikasikan aktor penyebab.
  • Human error adalah permasalahan sistem — perbaikan sistem akan membantu manusia mengambil keputusan/tindakan yang benar di kemudian hari.

Template dokumen postmortem umumnya berisi: Date, Author, Summary, Impact (dampak ke pengguna/bisnis/perusahaan), Root Causes, Trigger (event pemicu), Resolution (penanganan penyelesaian), Detection (mekanisme yang mendeteksi insiden), Action Items (daftar tindakan, baik yang berhasil maupun gagal), Lesson Learnt, dan Timeline kronologis kejadian.

Ilustrasi komik dari SRE Book menggambarkan pentingnya data integrity — sebuah service dianggap “up” hanya jika datanya juga benar-benar utuh, dan pentingnya memverifikasi backup benar-benar berfungsi (backup yang tidak pernah dites restore-nya sama saja tidak berguna):

Testing & Release Procedure

“If you haven’t tried it, assume it’s broken.”

Testing & release procedure memastikan sistem memiliki confidence terhadap reliability-nya: baik dengan tidak melakukan perubahan sama sekali (behaviour tetap sama), maupun dengan mendeskripsikan semua perubahan secara jelas sehingga uncertainty akibat perubahan tersebut dapat dianalisis.

Poin penting soal Testing & Mean Time to Repair (MTTR):

  • Lolos tes bukan berarti sistem bebas bug atau pasti reliable.
  • Monitoring dapat mendeteksi bug yang lolos, namun bug tersebut tetap ada di produksi.
  • Jika test dapat mendeteksi bug sebelum rilis, artinya bug tersebut terdeteksi dengan zero MTTR (tidak sempat berdampak ke pengguna).

Ragam jenis tes yang disebutkan: unit test, integration test, system test, smoke test, performance test, regression test, stress test, dan canary test.

Prinsip-Prinsip Resilience

Lima aturan (Rules of Resilience) dari Astrid Atkinson (Reliability from the Ground Up):

Rule #1: Every node for itself — “Keep doing what you’re doing, unless it’s actively unsafe.” Sebuah node harus bisa pulih dari failure secara mandiri: melalui loop script restarts, validate on startup (baru melaporkan OK jika benar-benar siap), dan meng-cache seluruh state yang dibutuhkan secara lokal. Sebuah node dapat gagal karena dependency yang bermasalah atau karena bad input.

Rule #2: Everything runs on more than one machine — serving component harus stateless, memanfaatkan idempotency dan sharding, serta data harus dipecah (split) antar mesin dan direplikasi. Menjalankan lebih dari satu cluster memberikan redundancy yang lebih baik.

Rule #3: Loosely coupled dependencies — kunci utamanya adalah decoupled architecture untuk membatasi blast radius (dampak kegagalan sebuah komponen) dan menghindari cascading failure, dengan cara: membatasi jumlah retry, membatasi rate request, menghindari Query of Death, menghindari proximity-based failover, dan menghindari long startup time. Pola (pattern) yang relevan:

  • Service registry — database yang menyimpan informasi service dan instance mana saja yang tersedia, sehingga alamat service tidak perlu di-hardcode ke dalam aplikasi.
  • Circuit breaker pattern — membatasi dampak kegagalan sebuah service agar tidak merambat ke service lain.
  • Bulkhead pattern — mengisolasi resource (misalnya connection pool) per workload/service, sehingga kegagalan satu workload tidak menghabiskan resource bersama untuk workload lain.

Rule #4: Design for change — (1) gunakan tools, bukan proses manual; (2) check in semua konfigurasi ke version control; (3) lakukan canary pada setiap perubahan; (4) rollback harus selalu aman dilakukan kapan pun.

Rule #5: Observe the system, not the components — pilih beberapa metrik level-tinggi yang menggambarkan perilaku keseluruhan sistem (mis. queries, latency, errors) dan pastikan metrik itu “sempurna”; detail metrik komponen individual hanyalah informasi latar belakang pendukung.

Catatan penutup materi ini: aspek terpenting dari reliability tetaplah people — saat terjadi masalah, pada akhirnya tetap dibutuhkan penanganan oleh engineer manusia.

Tabel: Penyebab Unavailability/Failure dan Mitigasinya

Tabel berikut merangkum penyebab gangguan reliability/availability yang dibahas di kedua materi (System Reliability dan Arsitektur Scalable) beserta mitigasinya:

Penyebab / Jenis GangguanPenjelasanMitigasi
Resource exhaustionPenambahan jumlah user, data, dan trafik mengakibatkan kekurangan resource.Capacity planning, autoscaling, monitoring beban.
Unplanned load-based changesKenaikan popularitas mendadak memerlukan perubahan aplikasi/konfigurasi yang sering dilakukan tanpa perencanaan matang.Load testing, capacity planning proaktif, canary release.
Increased number of moving partsAplikasi membesar, jumlah developer & perubahan bertambah, meningkatkan risiko error.Service-based architecture, complexity localization, testing menyeluruh.
Outside dependencyKetergantungan ke pihak eksternal (SaaS, infrastruktur pihak ketiga).Loosely coupled dependency, circuit breaker, graceful degradation.
Technical debtKompleksitas yang menumpuk seiring waktu.Refactoring berkelanjutan, blameless postmortem sebagai pembelajaran.
Process/node crashSebuah node gagal karena bug, bad input, atau dependency yang gagal.Redundancy (Rule #2 — everything runs on more than one machine), auto-restart/loop script, validate-on-startup.
Cascading failureKegagalan satu komponen merambat ke komponen lain yang bergantung padanya.Circuit breaker pattern, bulkhead pattern, rate limiting, pembatasan jumlah retry.
Overload / Query of DeathRequest tertentu (atau lonjakan request) membebani/mematikan service.Handling overload, rate limiting, menghindari query yang mahal (Query of Death).
Data corruption / data lossData rusak atau hilang karena bug atau kesalahan operasional.Backup terverifikasi (bukan sekadar backup, tapi dites restore-nya), data integrity checks.

Arsitektur Scalable

Design to Scale

Karakteristik bisnis saat ini menuntut arsitektur yang scalable: uncertainty, volatility (perubahan cepat baik dari sisi volume, produk, maupun harga), kompetisi, dan tuntutan cost efficiency. Kebutuhan untuk selalu available menjadi prasyarat — tanpa high availability, kebutuhan akan scalability pun menjadi tidak relevan.

Scalability sendiri mencakup tiga dimensi tantangan:

  • Handling more data — data yang membesar berdampak pada query yang lebih lama, beban storage lebih besar, dan trafik network yang meningkat.
  • Handling more concurrent request — pertambahan user memunculkan isu sinkronisasi.
  • Handling higher interaction rates — isu latency menjadi semakin kritikal.

Improve Availability dilakukan dengan: build with failure in mind, always think about scaling, mitigate risk, monitor availability, dan merespons masalah availability secara predictable & terdefinisi.

Scaling Vertikal vs Horizontal

AspekScaling VerticalScaling Horizontal
Cara kerjaMeningkatkan kapasitas satu mesin (server yang sama diperkuat)Menambah jumlah mesin/server
Contoh teknikTambah kapasitas I/O (RAID disk), perbaiki access time (SSD), tambah RAM untuk kurangi I/O, upgrade/tambah network interface, ganti processor lebih kuatMenambahkan komputer/server baru ke dalam sistem (mis. front cache, front app server, web services server)
BatasanTerbatas pada kapasitas maksimum satu mesin, tetap single point of failureSkalabilitas lebih besar, namun butuh load balancer & desain stateless

Konfigurasi awal (single-server) melayani semua trafik dari satu mesin:

Langkah scaling vertikal sederhana adalah mengganti server dengan mesin yang lebih kuat (“Stronger Server”) tanpa mengubah arsitektur.

Isolation of Services & Service-Based Architecture

Isolation of Services berarti memecah bagian sistem ke server yang berbeda, misalnya web server dipisahkan dari database, atau dipecah per domain/functionality:

Pada aplikasi monolithic yang kompleks, banyak tim developer mengubah satu codebase besar yang saling terkait erat, menyulitkan koordinasi. Pada service-based architecture, sistem dipecah menjadi service-service yang lebih kecil dan dapat ditangani tim terpisah, dengan manfaat: scaling decision yang lebih presisi per service, team assignment & focus yang lebih jelas, complexity localization, dan kemudahan testing.

Sebuah service dalam arsitektur ini adalah komponen standalone yang: memiliki separate codebase, mengelola datanya sendiri, menyediakan capabilities ke pihak lain, mengonsumsi capabilities dari pihak lain, dan memiliki single owner.

Stateless vs Stateful Service

Pada stateful server, setiap server menyimpan session data & file milik user tertentu secara lokal — jika user diarahkan ke server yang berbeda, data tersebut tidak tersedia:

Pada stateless server, server tidak menyimpan state apa pun di antara request; semua state (session, file) diambil dari shared storage (Shared Session Storage, Shared File Storage) sehingga request dari user mana pun dapat dilayani oleh server mana pun:

Untuk stateful service yang tidak dapat sepenuhnya dihindari (misalnya database), prinsipnya adalah localize data as much as possible.

Managing files: web application server tidak menyimpan file secara lokal — file publik didorong (push) ke shared file storage dan dapat di-cache lewat CDN; file privat memerlukan proses authentication & authorization di web server sebelum diambil dari private files storage.

Memanfaatkan CDN

Content Delivery Network (CDN) adalah layanan hosting yang menangani distribusi global file statik (HTML, CSS, JS, images, video) sehingga pengguna dilayani dari lokasi yang lebih dekat secara geografis, mengurangi beban ke data center utama dan mengurangi latency.

Scaling Horizontal: Overview Data Center

Arsitektur data center skala besar melibatkan banyak lapisan komponen yang masing-masing dapat di-scale horizontal secara independen: DNS/geoDNS, load balancer, front cache, front app server, cache servers, message queue servers, web services server, data store servers, search servers, dan batch/queue workers — semuanya terhubung ke CDN untuk konten statis:

Autoscaling adalah otomatisasi infrastruktur untuk menambah/mengurangi virtual server sesuai beban, umumnya disediakan oleh cloud provider (mis. Amazon Auto Scaling yang memantau metrik lewat CloudWatch) atau menggunakan Kubernetes.

Load Balancer juga dapat dimanfaatkan untuk rolling update (server di-update satu per satu secara bertahap) atau synchronized update (membuat set VM baru dengan software terbaru, lalu mengalihkan load balancer sekaligus), sekaligus memonitor kesehatan tiap server dan mengarahkan trafik menjauh dari server yang unhealthy.

Jenis Load Balancer

AspekNAT (Layer-4)Reverse Proxy (Application-layer)
Level kerjaTCP/IP layerHTTP layer
Cara kerjaForward paket satu per satu, mengingat server yang di-assign ke tiap clientMenyimpan full request/response sebelum meneruskan (mis. Nginx, Squid)
Skala~1–10 juta request/detik~100 ribu – 1 juta request/detik
Layanan yang didukungSemua jenis serviceHanya HTTP
Fitur tambahanTidak adaSSL termination, caching, compression
Implementasi umumHardware load balancer (mahal)Open-source (murah), mis. Nginx

Nginx sebagai reverse proxy load balancer bekerja dengan alur: client mengirim request ke LB → LB memilih upstream server → LB meneruskan request ke upstream → upstream mengirim response ke LB → LB mengenali klien terkait koneksi tersebut → LB meneruskan response ke client:

Local load balancer limitations: load balancer sendiri adalah single point of failure, hanya sanggup menangani ~1 juta request/detik, dan berada di satu data center (tidak dekat semua pelanggan, dan data center itu sendiri jadi single point of failure). Untuk layanan sangat besar, dibutuhkan global load balancer — umumnya berbasis DNS (bisa round-robin atau geographic load balancing di mana DNS server memberi respons sesuai IP address client). Ini memunculkan masalah distributed service discovery: bagaimana client menemukan replika service tanpa menghubungi bottleneck terpusat.

CDN pada dasarnya adalah kombinasi caching reverse proxy dengan geographic load balancing berbasis DNS (contoh: Akamai, CloudFront, Cloudflare, Google Cloud CDN).

Persistence Layer & Data Storage

Persistence Layer mencakup: Relational Data Store dengan pendekatan master-slave dan partitioning/sharding, serta Non-relational/specific Data Store (NoSQL).

Ragam pilihan teknologi penyimpanan data beserta use case-nya:

Jenis StorageContohUse Case
SQL Relational DBMySQL, OracleData terstruktur, data transaksional
Column-oriented DBSnowflake, BigQueryQuery SQL untuk analitik pada dataset besar (OLAP)
Search engineElasticsearchDokumen teks yang dapat dicari
Document storeMongoDBData semi-terstruktur (dokumen JSON)
Distributed cacheRedisCache in-memory dengan expiration, sangat cepat
NoSQL DBCassandra, DynamoData besar yang diakses secara paralel
Cloud object storeS3, Azure BlobsGambar, video, konten statis lain
Cluster filesystemHadoop distributed FSFile untuk komputasi paralel skala besar
Networked filesystem (NAS)NFS, EFS, EBSAplikasi yang didesain menulis ke local filesystem, tapi butuh storage yang scalable & shared

Goal umum teknologi penyimpanan data: scalability (data jauh lebih besar dari RAM), persistence (data tidak hilang), indexing (pencarian cepat), concurrency (dapat diakses bersamaan), analysis (query/analisis langsung di mesin storage), separation of concern, integrity, security, dan deduplication.

Authentication, Push Notification, dan API

Interaksi frontend-backend memerlukan authentikasi; mengirim kredensial (username/password) di setiap request tidak aman. Mekanisme umum: auth token (diberikan saat login, durasi umumnya pendek) dan API keys (auth token berjangka panjang, umumnya untuk interaksi antar service). Auth token pada HTTP request dapat diletakkan di query parameters, headers, atau body.

Karena client-server interaction umumnya berbasis request dari client, jika server perlu berinisiatif mengirim informasi (email, SMS, atau push notification), dibutuhkan arsitektur khusus karena client tidak bisa menyediakan REST API sendiri (lokasi dapat berpindah dan biasanya menggunakan private IP).

Arsitektur push notification: client OS membuat satu koneksi untuk semua aplikasi (mis. lewat Apple Push Notification Service/APNs), dan service pengirim mengirim notifikasi melalui pihak ketiga (Apple/Google) tersebut:

Prinsip arsitekturnya: dibuat push notification service khusus, client diidentifikasi lewat device ID, client meregistrasikan lokasinya saat aktif/berpindah lokasi, service pengirim notifikasi mengirim message ke push notification service, dan client membuka long-lived TCP connection ke push notification service.

Untuk web browser, mekanisme push notification dapat berupa HTTP long polling (client mengirim request, server merespons setelah data tersedia atau setelah timeout, mis. 60 detik) atau WebSocket (koneksi tetap terbuka dan bidirectional):

Software service umumnya menyediakan RPC API dalam bentuk REST, SOAP, Thrift, Protocol Buffer, atau GraphQL, dengan mekanisme authentication untuk memastikan siapa/apa yang mengakses service.

Monolithic vs Microservices

AspekMonolithicMicroservices
Development, deploy, test, debug, koordinasi, sharing dataLebih mudah karena satu codebaseLebih kompleks karena banyak service terpisah
Transaction (ACID)Lebih mudah didukungLebih sulit (transaksi lintas service)
Optimasi DBLebih mudah (satu DB untuk semua service)Perlu strategi per service
Bottleneck developmentRawan, karena tim besar mengubah codebase yang samaLebih rendah, tiap tim punya codebase/service sendiri
Struktur kodeSatu codebase besar rawan berantakanKode terpisah per service, lebih terkelola
DeploymentSeluruh aplikasi harus di-deploy ulangTiap service dapat di-deploy independen
Bahasa/runtimeHarus seragam (bahasa, build system, runtime yang sama)Dapat berbeda-beda per service

Menangani Kegagalan Service

Strategi dealing with service failures: graceful degradation (menurunkan kualitas layanan alih-alih gagal total), graceful backoff, fail as early as possible, dan penanganan khusus untuk customer caused problem.

Service Tier mengklasifikasikan dampak kegagalan sebuah service: Tier 1 (critical), Tier 2 (penting, tapi jika gagal hanya menurunkan kualitas layanan ke customer), Tier 3 (dampak terbatas), Tier 4 (tidak ada dampak signifikan).

Load Balancer secara umum berperan sebagai titik kontak tunggal dari sebuah service: request diteruskan ke workers/backend, user hanya melihat satu server/IP, sementara load balancer dapat menangani puluhan hingga ratusan backend server sekaligus.

System Design

Tipe Arsitektur

Empat pola arsitektur dasar yang menjadi building block system design: client-server (client langsung terhubung ke satu server), 3-tier (client → application server → DB), multi-tier (client → web server → application server → DB), dan P2P (peer-to-peer, semua node saling terhubung tanpa server pusat).

Studi Kasus: Evolusi Arsitektur “myweb.com” dari Zero hingga 100K+ Users

Studi kasus ini (dibawakan oleh Samuel Simon, Senior Software Architect @ GovTech Edu) mendemonstrasikan secara bertahap bagaimana sebuah arsitektur sederhana berkembang menjadi arsitektur scalable ketika jumlah pengguna bertambah — mempraktikkan langsung konsep reliability dan scalability yang dibahas di dua bagian sebelumnya.

Tahap 1 — Zero to 1K Users. Arsitektur paling sederhana: user melakukan resolusi DNS untuk www.myweb.com (langkah 1–2), lalu mengakses satu server aplikasi tunggal (langkah 3) yang terhubung ke satu database (langkah 4).

Tahap 2 — 1K to 10K Users: muncul masalah availability. Dengan arsitektur yang sama persis (satu server, satu DB), begitu jumlah user bertambah, server mulai kewalahan dan muncul error “Service unavailable / Server too busy”. Ini menunjukkan bahwa arsitektur single-server tidak scalable terhadap pertumbuhan trafik.

Tahap 3 — Menentukan strategi scaling. Ada dua pilihan dasar: vertical scaling (memperkuat satu mesin yang sama — CPU, RAM, storage lebih besar) atau horizontal scaling (menambah jumlah mesin/server).

Tahap 4 — 1K to 100K Users: horizontal scaling + Load Balancer. Server aplikasi digandakan menjadi beberapa instance, dan sebuah Load Balancer ditambahkan di depan kumpulan server tersebut (langkah 3 → 3b) untuk mendistribusikan trafik secara merata ke server-server backend, sebelum diteruskan ke database (langkah 4).

Tahap 5 — Scaling Database. Database tunggal juga menjadi bottleneck baru, sehingga perlu diperbanyak menjadi beberapa instance DB.

Tahap 6 — Memilih strategi database: Sharding vs Replication. Sharding membagi data ke beberapa DB berbeda (DB1, DB2, …, DBN) sehingga setiap shard menyimpan subset data yang berbeda; Replication menduplikasi seluruh data yang sama ke beberapa DB (satu DB utama dan beberapa replica).

Tahap 7 — Menerapkan Read/Write Replication. Arsitektur final tahap ini menerapkan replication: server aplikasi melakukan write ke satu DB utama, yang kemudian direplikasi (replication) ke kumpulan DB read replica; server aplikasi melakukan read dari kumpulan replica tersebut. Pola ini memisahkan beban baca dan tulis agar database lebih scalable.

Tahap 8 — Improving Latency dengan Cache. Sebuah komponen cache (mis. Redis Cache) ditambahkan sejajar dengan load balancer/DB replica untuk mempercepat pembacaan data yang sering diakses, mengurangi beban langsung ke database.

Tahap 9 — Improving Latency dengan CDN. Sebuah CDN ditambahkan di sisi user untuk melayani konten statis dari lokasi yang lebih dekat secara geografis, sehingga permintaan tidak perlu selalu mencapai server pusat.

Secara konseptual, CDN bekerja dengan menempatkan edge server/PoP (Point of Presence) di berbagai lokasi geografis dekat pengguna, dibandingkan hanya melayani semua user dari satu origin server yang jauh:

Poin diskusi dari slide: apa saja yang bisa disimpan di CDN (umumnya konten statis: HTML, CSS, JS, gambar, video), dan apakah response API bisa disimpan di CDN (dapat, untuk response yang jarang berubah/cacheable, namun perlu strategi invalidasi cache yang tepat).

Tahap 10 — Event-based Pattern dengan Message Queue. Sekumpulan server pekerja (workers) baru ditambahkan, terhubung ke server aplikasi utama melalui Message Queue, memungkinkan pemrosesan tugas secara asynchronous (event-based) tanpa memblokir alur request-response utama.

Tahap 11 — Pertimbangan Monolith vs Microservices. Pada titik tertentu, arsitektur monolith (satu kumpulan server + satu DB di belakang satu load balancer) dapat dipecah menjadi microservices: beberapa kelompok server kecil, masing-masing dengan DB-nya sendiri, saling berkomunikasi satu sama lain, tetap di belakang satu load balancer/DNS yang sama dari sisi user.

Poin diskusi dari slide — perbandingan kapan sebaiknya memilih monolith vs microservices, ditinjau dari lima aspek:

AspekMonolith (cenderung)Microservices (cenderung)
DevelopmentLebih sederhana di awal (satu codebase)Lebih kompleks (banyak service, banyak repo)
TestingLebih mudah (dependency terpusat)Perlu strategi test lintas service (integration test antar service)
DeploymentDeploy sekaligus (all-or-nothing), lebih berisikoDeploy independen per service, risiko lebih terisolasi
ScalabilityScaling seluruh aplikasi sekaligus, kurang efisienScaling granular hanya pada service yang butuh
Fault-toleranceKegagalan satu bagian dapat menjatuhkan seluruh aplikasiKegagalan satu service dapat diisolasi (dengan pola seperti circuit breaker/bulkhead)

Tahap 12 — Logging/Monitoring untuk Mengelola Kompleksitas. Setelah arsitektur menjadi kompleks (load balancer, banyak server, cache, message queue, banyak DB), ditambahkan lapisan Logging, Metrics, dan Monitoring/Alert yang mengamati keseluruhan sistem — praktik ini selaras dengan prinsip “observe the system, not the components” pada bagian System Reliability.

Studi kasus ditutup dengan sesi diskusi mendalam bertajuk “Studi Kasus” (dilanjutkan secara interaktif/verbal dalam sesi kelas tanpa slide tambahan pada materi ini) untuk mempraktikkan penerapan seluruh konsep di atas pada kasus nyata.

Rangkuman Pola Evolusi yang Terlihat pada Studi Kasus

Dari seluruh tahapan di atas, terlihat sebuah pola pendekatan yang konsisten dalam mendesain sistem berskala besar: mulai dari arsitektur paling sederhana yang cukup untuk kebutuhan awal → identifikasi bottleneck konkret yang muncul seiring pertumbuhan beban (availability, kapasitas server, kapasitas database, latency, kompleksitas operasional) → terapkan teknik scalability yang paling sesuai untuk bottleneck tersebut (horizontal scaling, load balancer, sharding/replication, caching, CDN, message queue, microservices) → tambahkan observability (logging/monitoring) begitu sistem menjadi cukup kompleks untuk dipantau secara manual. Pendekatan bertahap ini mencerminkan penerapan langsung prinsip-prinsip reliability (redundancy, loosely coupled dependency, observability) dan scalability (vertical/horizontal scaling, stateless service, caching, database partitioning) yang telah dibahas sebelumnya.

Flashcard

flashcards Apa perbedaan definisi antara Reliability dan Resilience menurut materi ini? :: Reliability adalah kualitas untuk dapat dipercaya/bekerja konsisten dari waktu ke waktu, sedangkan Resilience adalah kapasitas untuk pulih dengan cepat dari kesulitan — kemampuan sistem untuk kembali ke kondisi normal setelah mengalami gangguan. Apa inti dari prinsip “blameless postmortem” dan mengapa itu penting? :: Blameless postmortem berfokus pada perbaikan sistem (memahami root cause, mis. lewat 5 Whys, dan menyusun action plan) tanpa mengindikasikan aktor penyebab kesalahan. Ini penting karena human error adalah masalah sistem, dan ketakutan akan hukuman membuat engineer menghindari pengambilan risiko terkontrol yang justru diperlukan. Sebutkan lima “Rules of Resilience” dari Astrid Atkinson. :: (1) Every node for itself — node pulih mandiri; (2) Everything runs on more than one machine — redundancy & statelessness; (3) Loosely coupled dependencies — batasi blast radius dengan circuit breaker/bulkhead; (4) Design for change — pakai tools, canary, rollback aman; (5) Observe the system, not the components — fokus pada metrik level sistem. Apa fungsi Circuit Breaker dan Bulkhead pattern dalam mencegah cascading failure? :: Circuit breaker membatasi dampak kegagalan sebuah service agar tidak merambat (cascading) ke service lain yang bergantung padanya. Bulkhead pattern mengisolasi resource (mis. connection pool) per workload/service, sehingga satu workload yang bermasalah tidak menghabiskan resource bersama yang dipakai workload lain. Apa perbedaan mendasar antara scaling vertikal dan scaling horizontal? :: Scaling vertikal meningkatkan kapasitas satu mesin (mis. tambah RAM, ganti SSD, upgrade processor), sedangkan scaling horizontal menambah jumlah mesin/server yang bekerja bersama-sama, biasanya membutuhkan load balancer dan desain service yang stateless. Mengapa stateless service lebih mudah di-scale secara horizontal dibanding stateful service? :: Karena stateless service tidak menyimpan state di antara request — semua session/file diambil dari shared storage, sehingga request dari user mana pun dapat dilayani oleh instance server mana pun tanpa bergantung pada server tertentu yang menyimpan state user tersebut. Apa perbedaan load balancer tipe NAT (Layer-4) dan Reverse Proxy? :: NAT bekerja di layer TCP/IP dengan meneruskan paket berdasarkan IP/port dan cocok untuk semua jenis service dengan skala sangat tinggi (~1-10 juta request/detik), sedangkan Reverse Proxy bekerja di layer HTTP, menyimpan full request/response, hanya untuk layanan HTTP, tapi punya fitur tambahan seperti SSL termination dan caching, dengan skala lebih rendah (~100rb-1 juta request/detik). Apa perbedaan sharding dan replication pada database sebagai strategi scaling? :: Sharding membagi data ke beberapa database berbeda sehingga tiap shard menyimpan subset data yang berbeda (membagi beban penyimpanan), sedangkan replication menduplikasi seluruh data yang sama ke beberapa database (satu utama + replica) untuk memisahkan beban baca (read) dari beban tulis (write) dan meningkatkan availability. Pada studi kasus evolusi arsitektur myweb.com, apa yang terjadi ketika trafik naik dari 1K ke 10K users tanpa perubahan arsitektur? :: Server single-instance yang sama menjadi kewalahan dan muncul error “Service unavailable / Server too busy”, menunjukkan bahwa arsitektur satu-server tidak scalable terhadap pertumbuhan trafik dan menjadi pemicu langkah scaling berikutnya. Sebutkan minimal empat tahapan berurutan dalam evolusi arsitektur studi kasus system design setelah load balancer ditambahkan. :: Setelah load balancer: (1) database digandakan/dipecah lewat sharding atau replication, (2) ditambahkan cache (mis. Redis) untuk improving latency, (3) ditambahkan CDN untuk konten statis, (4) ditambahkan message queue untuk event-based/asynchronous processing, dan selanjutnya dipertimbangkan migrasi ke microservices serta ditambahkan logging/monitoring untuk mengelola kompleksitas. Menurut diskusi pada studi kasus, apa trade-off utama antara desain monolith dan microservices dari sisi deployment dan fault-tolerance? :: Monolith di-deploy sekaligus (all-or-nothing) sehingga lebih berisiko, dan kegagalan satu bagian bisa menjatuhkan seluruh aplikasi; microservices dapat di-deploy independen per service dan kegagalan satu service dapat diisolasi (mis. dengan circuit breaker/bulkhead), sehingga fault-tolerance lebih baik meski development dan testing menjadi lebih kompleks. Mengapa lapisan Logging/Monitoring baru ditambahkan pada tahap akhir evolusi arsitektur studi kasus, dan apa kaitannya dengan prinsip resilience? :: Karena begitu arsitektur menjadi kompleks (load balancer, banyak server, cache, message queue, banyak DB), kompleksitas tersebut perlu dikelola dengan observability. Ini selaras dengan Rule #5 resilience (“observe the system, not the components”) yang menekankan pemantauan metrik level sistem secara keseluruhan, bukan hanya komponen individual.