Apa itu System Design? Inilah Pengertian, Konsep, Metode, dan Dampaknya Bagi Software Engineer

Assalamu‘alaikum wr. wb.

Halo gais! Kembali lagi di Teknoblog dari Inzaghi's Blog! Kali ini kita akan membahas tentang System Design yang perlu kalian ketahui, untuk merancang sebuah Sistem dan Arsitektur dalam Pengembangan Perangkat Lunak (Software Development).

Apa itu System Design? Inilah Pengertian, Konsep, Metode, dan Dampaknya Bagi Software Engineer

Sumber Artikel Materi : en.Wikipedia.orgGeeksforgeeks.org, Systemdesignhandbook.com (Blog), Algomaster.io, dan Sko.dev

System Design adalah proses menentukan bagaimana sebuah sistem perangkat lunak harus dirancang dan disusun agar mampu memenuhi kebutuhan serta persyaratan yang telah ditetapkan pada skala penggunaan yang diharapkan.

System Design tidak sekadar membuat diagram yang berisi kotak dan garis penghubung. Perancangan sistem yang baik harus menjelaskan apa yang harus dilakukan oleh sistem, bagaimana data mengalir di dalamnya, komponen apa yang bertanggung jawab terhadap setiap tugas, bagian mana yang berpotensi mengalami kegagalan atau penurunan performa, serta berbagai trade-off yang dipilih dalam rancangan tersebut.

Pada aplikasi berskala kecil, satu server dan satu database mungkin sudah cukup untuk menjalankan seluruh kebutuhan aplikasi. Namun, ketika jumlah traffic, data, pengguna, serta tuntutan terhadap keandalan (reliability) semakin meningkat, arsitektur sistem biasanya membutuhkan lebih banyak komponen, seperti load balancer, cache, queue, database replica, partition, monitoring, serta mekanisme untuk menangani berbagai jenis kegagalan (failure handling).

Tujuan utama System Design adalah membangun arsitektur sesederhana mungkin, tetapi tetap mampu memenuhi seluruh kebutuhan dan persyaratan sistem. Dengan demikian, sistem tidak dibuat terlalu kompleks tanpa alasan, tetapi tetap memiliki kemampuan untuk menangani beban, menjaga performa, dan berkembang sesuai kebutuhan.

A. Pengertian System Design

Apa itu System Design? [Sumber Gambar : ChatGPT]

System Design adalah proses merencanakan dan menyusun arsitektur sebuah sistem perangkat lunak berdasarkan kebutuhan pengguna. Proses ini menentukan bagaimana berbagai komponen dalam sistem saling bekerja sama dan berkomunikasi untuk menghasilkan fungsi yang diinginkan secara efektif dan efisien.

  • System Design menerjemahkan kebutuhan pengguna menjadi blueprint teknis dengan menentukan komponen sistem, aliran data (data flow), serta interaksi antar-service.
  • Tujuannya adalah menghasilkan struktur sistem yang terorganisasi, efisien, dan sesuai dengan kebutuhan, sekaligus mempertimbangkan aspek seperti scalability, maintainability, dan performance.

Secara lebih luas, System Design berperan dalam mengubah kebutuhan produk yang masih bersifat abstrak menjadi keputusan teknis yang konkret dan dapat diterapkan pada skala besar. Proses ini mendorong engineer untuk tidak hanya berfokus pada penulisan kode, tetapi juga mempertimbangkan pola traffic, biaya infrastruktur, konsistensi data, reliability, serta kemudahan pemeliharaan sistem dalam jangka panjang.

System Design yang baik memastikan bahwa sebuah sistem tidak hanya dapat berjalan dengan baik saat ini, tetapi juga mampu tetap berfungsi secara optimal ketika jumlah pengguna, volume data, dan kompleksitas sistem terus bertambah.

Dalam proses perancangannya, System Design perlu menjawab beberapa pertanyaan penting, antara lain:

  • Komponen apa saja yang dibutuhkan oleh sistem?
  • Bagaimana setiap komponen akan saling berkomunikasi?
  • Bagaimana sistem dapat menangani peningkatan jumlah pengguna?
  • Bagaimana cara memastikan sistem tetap reliable dan available?
  • Data apa yang perlu disimpan dan bagaimana struktur datanya harus dirancang?
  • Apa saja trade-off yang muncul dari setiap keputusan dalam perancangan sistem?

B. Alasan Pentingnya System Design

Perangkat lunak modern tidak dibangun secara terisolasi. Sebuah sistem biasanya berinteraksi dengan berbagai komponen seperti API, platform cloud, distributed cache, message broker, dan data pipeline. Tanpa pemahaman dan perencanaan System Design, tim berisiko membangun sistem yang memang dapat berjalan dengan baik dalam skala kecil, tetapi mengalami masalah atau bahkan gagal ketika digunakan dalam kondisi dunia nyata.

System Design membantu tim mengantisipasi berbagai permasalahan yang mungkin muncul di lingkungan produksi, merencanakan kapasitas sistem secara efektif, serta membangun sistem yang dapat beroperasi secara konsisten dan dapat diprediksi, bahkan ketika terjadi kegagalan pada salah satu komponennya.

System Design juga bukan hanya diperuntukkan bagi senior engineer atau software architect. Setiap engineer akan mendapatkan manfaat dari pemahaman mengenai cara kerja dan perancangan sistem, karena :

1. Menentukan kemampuan sistem untuk melakukan scaling

Sistem dengan desain yang buruk dapat mengalami penurunan performa atau bahkan gagal ketika menerima beban yang tinggi. Sebaliknya, sistem yang dirancang dengan baik dapat menangani jutaan pengguna dengan performa yang tetap stabil dan dapat diprediksi.

2. Meningkatkan reliability dan user experience

Perancangan sistem yang baik membantu mencegah berbagai masalah seperti downtime, system outage, dan kehilangan data, sehingga pengalaman pengguna dapat tetap terjaga.

3. Mengurangi Biaya Engineering dalam jangka panjang

Arsitektur yang baik dapat mencegah technical debt berkembang secara berlebihan. Dengan membuat keputusan desain yang tepat sejak awal, tim dapat mengurangi biaya dan kompleksitas pemeliharaan sistem di kemudian hari.

4. Membantu Kolaborasi dalam Tim

Pemahaman arsitektur yang sama membuat seluruh anggota tim memiliki gambaran dan pemahaman yang selaras mengenai sistem. Hal ini mempermudah komunikasi, pembagian tugas, serta pengambilan keputusan selama proses pengembangan.

5. Penting dalam proses Technical Interview

Kemampuan System Design menjadi salah satu aspek yang banyak dinilai dalam proses wawancara di perusahaan teknologi besar. Kandidat sering kali diminta menunjukkan kemampuan dalam merancang sistem yang scalable, reliable, dan mampu menangani berbagai kondisi produksi.

C. Jenis-jenis System Design

Sebagian besar proyek nyata sebenarnya menggabungkan HLD (High-Level Design) dan LLD (Low-Level Design). Sebagai contoh, ketika merancang fitur notifikasi, diperlukan pemikiran pada tingkat tinggi untuk menentukan bagaimana suatu event mengalir dan diproses melalui berbagai layanan (services). Di sisi lain, diperlukan pula detail tingkat rendah, seperti bagaimana data notifikasi disimpan dan bagaimana jumlah notifikasi yang belum dibaca (unread count) dapat diambil secara efisien.

Engineer yang memahami kedua tingkat tersebut dapat menghasilkan solusi yang lebih terstruktur, scalable, dan mudah dipahami oleh anggota tim lainnya.

Secara umum, System Design dapat dibagi menjadi dua kategori utama :

1. High-Level Design (HLD)

High-Level Design berfokus pada arsitektur sistem dan komponen-komponen utama yang membentuk keseluruhan sistem. HLD lebih menekankan bagaimana berbagai komponen saling terhubung dan berkomunikasi tanpa terlalu masuk ke detail implementasi internal.

HLD umumnya mencakup hal-hal berikut:

  • Mengidentifikasi modul utama, services, serta hubungan atau interaksi di antara komponen tersebut.
  • Berfokus pada arsitektur sistem dan keputusan desain tingkat tinggi.
  • Biasanya disusun oleh software architect, stakeholder, dan senior developer yang memiliki pengalaman dalam pengembangan sistem.

a. Pengetahuan Teknis yang Dibutuhkan untuk HLD

Berikut beberapa kemampuan dan konsep yang umumnya perlu dipahami untuk melakukan High-Level Design:

  1. Kemampuan coding dasar, termasuk pemahaman mengenai Data Structures and Algorithms (DSA).
  2. Dibandingkan dengan Low-Level Design (LLD), HLD biasanya dikerjakan oleh engineer yang lebih senior karena membutuhkan pengalaman langsung dalam mengembangkan dan merancang sistem perangkat lunak.
  3. Memahami fungsi berbagai komponen seperti database SQL dan NoSQL, cache seperti Redis, Memcached, dan CDN, serta API.
  4. Memahami secara mendalam Functional Requirements dan Non-Functional Requirements yang harus dipenuhi oleh sistem.
  5. Memahami dasar-dasar networking dan security, seperti DNS, protokol TCP/UDP, HTTP, WebSockets, OAuth, JWT, TLS/SSL, rate limiting, keamanan API, serta dasar-dasar perlindungan terhadap DDoS.
  6. Memahami message queue dan streaming platform, seperti Kafka dan RabbitMQ.
  7. Memahami perbedaan Microservices dan Monolith, termasuk kapan sebuah sistem sebaiknya dipecah menjadi beberapa service dan bagaimana mengelola dependensinya.
  8. Memahami konsep fault tolerance, fallback strategy, redundancy, serta berbagai jenis dan algoritma load balancer.
  9. Memahami observability tools, seperti Prometheus, Grafana, ELK Stack (Elasticsearch, Logstash, dan Kibana), serta sistem alerting seperti PagerDuty.

b. Topik yang Dibahas dalam HLD

HLD berfokus pada arsitektur sistem, modul utama, serta interaksi antar-komponen. Beberapa topik yang biasanya dibahas meliputi :

  • System Architecture Overview: Menjelaskan komponen dan modul utama dalam sistem serta bagaimana komponen tersebut saling berinteraksi, misalnya melalui services, message queues, dan database.
  • Data Flow dan Component Interaction: Menggambarkan bagaimana data berpindah dari satu modul ke modul lainnya, termasuk berbagai integrasi dan interface penting yang digunakan.
  • Technology Stack dan Infrastructure: Menentukan teknologi yang digunakan pada tingkat tinggi, seperti framework, platform, hardware, database, serta konfigurasi hosting dan infrastruktur.
  • Module Responsibilities: Menjelaskan tanggung jawab masing-masing modul, fungsi yang dijalankannya, serta hubungan modul tersebut dengan komponen lainnya.
  • Performance dan Trade-offs: Membahas berbagai pertimbangan dalam desain sistem, termasuk trade-off, performa, scalability, security, cost, serta faktor-faktor non-functional lainnya. Dalam System Design, suatu keputusan tidak selalu memiliki solusi yang sempurna sehingga perlu mempertimbangkan kelebihan dan kekurangannya.
  • Artifacts: HLD biasanya menghasilkan berbagai artefak atau dokumentasi visual, seperti architecture diagram, component diagram, deployment diagram, data flow diagram, serta gambaran umum ER diagram atau database schema.

c. Contoh-contoh HLD

Contohnya meliputi :

  • API dan services
  • Database
  • Message queue
  • Cache
  • Load balancer
  • Microservices dan monolith
  • Diagram alur data tingkat tinggi (high-level data flow diagram)

Intinya, HLD berfokus pada gambaran besar sistem: komponen apa saja yang diperlukan, bagaimana komponen tersebut saling berkomunikasi, teknologi apa yang digunakan, serta bagaimana sistem dirancang agar memenuhi kebutuhan performance, scalability, reliability, security, dan cost.

2. Low-Level Design (LLD)

Low-Level Design berfokus pada logika internal dan detail implementasi setiap komponen. Jika HLD menjelaskan gambaran besar sistem, LLD menjelaskan bagaimana masing-masing komponen tersebut bekerja secara lebih terperinci.

LLD umumnya mencakup :

  • Menjelaskan logika internal, class, method, dan struktur data yang digunakan oleh setiap modul.
  • Mengubah rancangan dari High-Level Design (HLD) menjadi rencana implementasi yang lebih detail.
  • Biasanya dibuat oleh senior developer atau software designer sebelum proses coding dimulai.

a. Pengetahuan Teknis yang Dibutuhkan untuk LLD

Sebelum membuat Low-Level Design, developer perlu memiliki pemahaman yang kuat mengenai dasar-dasar pemrograman dan konsep software design.

  1. Kemampuan coding dasar, terutama Data Structures and Algorithms (DSA).
  2. Pemahaman yang kuat mengenai konsep Object-Oriented Programming (OOP), seperti :
    • Encapsulation — membungkus data dan perilaku dalam sebuah object serta mengontrol akses terhadapnya.
    • Inheritance — memungkinkan sebuah class mewarisi atribut dan method dari class lainnya.
    • Polymorphism — memungkinkan object yang berbeda merespons interface atau method yang sama dengan cara yang berbeda.
    • Abstraction — menyederhanakan kompleksitas dengan hanya menampilkan bagian yang penting dan menyembunyikan detail implementasinya.

b. Topik yang Dibahas dalam LLD

LLD menjelaskan bagaimana setiap komponen sistem akan diimplementasikan, termasuk class, method, atribut, struktur data, serta logika yang digunakan.

  • Component/Module Breakdown: Menguraikan logika internal setiap modul secara terperinci, termasuk tanggung jawab class, method, atribut, serta interaksi antar-class atau modul.
  • Database Schema & Structure: Merancang struktur database secara detail, seperti table, primary key, foreign key, index, dan relationship. Untuk database SQL maupun NoSQL, rancangan tersebut dapat disesuaikan dengan kebutuhan sistem.
  • API & Interface Definitions: Mendefinisikan API dan interface secara lebih spesifik, termasuk format request dan response, HTTP method, endpoint, error code, serta komunikasi internal antar-komponen.
  • Error Handling & Validation Logic: Menentukan bagaimana setiap modul menangani input yang tidak valid, kegagalan proses, edge case, serta logging ketika terjadi error.
  • Design Patterns & SOLID: Menerapkan berbagai design pattern dan prinsip SOLID agar kode menjadi lebih bersih, mudah dikembangkan, mudah dipelihara, dan fleksibel terhadap perubahan.
  • UML dan Pseudocode Artifacts: Menggunakan berbagai artefak seperti UML class diagram, sequence diagram, pseudocode, dan flowchart untuk memperjelas alur logika, hubungan antar-object, serta pemanggilan method.

c. Contoh-contoh LLD

Contohnya meliputi :

  • Class diagram
  • Data model
  • Algoritma
  • Interaksi antar-object
  • State transition

Singkatnya, HLD menentukan “apa saja komponen sistem dan bagaimana komponen tersebut saling terhubung”, sedangkan LLD menjelaskan “bagaimana setiap komponen tersebut akan dibangun secara detail di dalam kode”.

D. Konsep Utama dalam System Design

System Design mencakup berbagai konsep yang luas, tetapi beberapa di antaranya hampir selalu muncul dalam arsitektur sistem modern. Pada tingkat yang lebih mendalam, System Design mengharuskan kita mempertimbangkan berbagai trade-off atau kompromi, misalnya antara consistency dan availability, komunikasi synchronous dan asynchronous, serta biaya operasional dan biaya penyimpanan. Dengan memahami konsep-konsep tersebut, engineer dapat membuat keputusan arsitektur yang lebih tepat dan membangun sistem yang lebih tangguh (resilient) terhadap berbagai kondisi dan kegagalan.

Untuk memahami System Design, kita perlu mengenali berbagai building blocks atau komponen dasar yang digunakan untuk membangun sistem yang dapat berkembang (scalable).

1. Scalability

Scalability adalah kemampuan sistem untuk menangani peningkatan jumlah pengguna, request, atau beban kerja tanpa mengalami penurunan performa yang signifikan.

Konsep yang termasuk di dalamnya :

  • Horizontal Scaling dan Vertical Scaling
  • Replication
  • Sharding
  • Stateless Services

2. Reliability dan Availability

Reliability berkaitan dengan kemampuan sistem untuk tetap bekerja dengan benar dan konsisten, sedangkan availability menunjukkan seberapa besar kemungkinan sistem tetap dapat digunakan ketika dibutuhkan.

Konsep yang umum digunakan :

  • Redundancy — menyediakan komponen cadangan untuk mengurangi dampak kegagalan.
  • Failover — mengalihkan proses ke sistem atau komponen cadangan ketika komponen utama mengalami kegagalan.
  • Distributed Consensus — mekanisme agar beberapa node dalam sistem terdistribusi dapat mencapai kesepakatan mengenai suatu kondisi atau keputusan.
  • Replicated Data Stores — menyimpan salinan data pada beberapa server atau node untuk meningkatkan ketersediaan dan ketahanan data.

3. Performance

Performance berkaitan dengan seberapa cepat dan efisien sistem memproses request serta memberikan respons kepada pengguna.

Beberapa konsep pentingnya adalah :

  • Latency vs Throughput — mempertimbangkan waktu yang dibutuhkan untuk menyelesaikan satu request dibandingkan jumlah request yang dapat diproses dalam periode tertentu.
  • Efficient Data Access — mengoptimalkan cara sistem membaca dan menulis data.
  • Caching — menyimpan data yang sering digunakan di tempat yang lebih cepat diakses sehingga mengurangi beban sistem.
  • Load Balancing — membagi beban request ke beberapa server agar tidak terpusat pada satu server saja.

4. Data Modeling

Data Modeling adalah proses merancang bagaimana data disusun, disimpan, dan saling berhubungan di dalam sistem.

Konsep yang perlu dipahami meliputi :

  • SQL dan NoSQL
  • Indexing
  • Partitioning
  • Schema Design

5. Communication

Communication membahas bagaimana berbagai komponen, service, atau aplikasi dalam sistem saling berkomunikasi dan bertukar data.

Beberapa mekanisme yang umum digunakan :

  • REST
  • gRPC
  • Event-Driven Messaging
  • Pub/Sub Systems
  • WebSockets

6. Security

Security bertujuan melindungi sistem, data, serta pengguna dari akses yang tidak sah dan berbagai ancaman keamanan.

Konsep utamanya meliputi :

  • Authentication — memastikan identitas pengguna atau service.
  • Authorization — menentukan resource atau tindakan apa yang boleh diakses oleh pengguna atau service.
  • Encryption — melindungi data dengan mengubahnya menjadi bentuk yang tidak mudah dibaca oleh pihak yang tidak berwenang.
  • Rate Limiting — membatasi jumlah request yang dapat dilakukan dalam periode tertentu untuk mencegah penyalahgunaan dan menjaga kestabilan sistem.

7. Observability

Observability merupakan kemampuan untuk memahami kondisi internal sebuah sistem berdasarkan informasi yang dihasilkan ketika sistem tersebut berjalan. Hal ini membantu engineer menemukan masalah, menganalisis performa, dan mengetahui penyebab kegagalan.

Komponen utamanya meliputi :

  • Logging — mencatat aktivitas dan kejadian yang terjadi dalam sistem.
  • Metrics — mengumpulkan data numerik mengenai kondisi dan performa sistem.
  • Distributed Tracing — melacak perjalanan sebuah request melalui berbagai service dalam sistem terdistribusi.
  • Monitoring dan Alerts — memantau kondisi sistem dan memberikan notifikasi ketika terjadi masalah atau kondisi tertentu.

Secara keseluruhan, konsep-konsep tersebut merupakan fondasi utama dalam System Design. Engineer tidak hanya perlu mengetahui cara menggunakan masing-masing teknologi, tetapi juga memahami kapan teknologi tersebut digunakan, mengapa dipilih, serta trade-off yang muncul dari setiap keputusan arsitektur. Dengan pemahaman tersebut, sistem dapat dirancang agar lebih scalable, reliable, performant, secure, dan mudah dioperasikan.

E. Dampak System Design bagi Software Engineer

System design memiliki dampak besar terhadap perkembangan seorang Software Engineer karena mengubah cara berpikir dari sekadar “bagaimana membuat fitur?” menjadi “bagaimana membangun sistem yang dapat berkembang, aman, andal, dan mudah dipelihara?”.

Contoh Sederhananya adalah saat Seorang Engineer mungkin awalnya berpikir :

“Bagaimana saya membuat endpoint untuk upload foto?”

Dengan pemahaman system design, pertanyaannya berkembang menjadi:

“Bagaimana sistem upload foto ini menangani jutaan user, file berukuran besar, concurrent upload, storage cost, keamanan file, CDN, retry ketika upload gagal, dan monitoring?”

Perubahan cara berpikir inilah yang menjadi salah satu dampak terbesar system design bagi Software Engineer.

Intinya : system design membuat Software Engineer tidak hanya menjadi orang yang bisa menulis kode, tetapi menjadi engineer yang mampu merancang solusi teknis secara menyeluruh dan mengambil keputusan dengan mempertimbangkan konsekuensi jangka panjang.

Beberapa dampak utamanya :

1. Meningkatkan kemampuan Problem Solving

Engineer belajar memecah masalah besar menjadi komponen-komponen yang lebih kecil dan menentukan bagaimana komponen tersebut berinteraksi.

2. Memahami Trade-off Teknis

Tidak ada arsitektur yang selalu paling baik. System design melatih engineer mempertimbangkan trade-off antara performance, scalability, reliability, complexity, cost, dan maintainability.

3. Meningkatkan kualitas keputusan teknis

Engineer tidak hanya memilih teknologi karena sedang populer, tetapi berdasarkan kebutuhan sistem. Misalnya, memahami kapan menggunakan caching, database replication, message queue, atau load balancer.

4. Mempersiapkan sistem untuk scalability

Engineer dapat merancang aplikasi yang mampu menangani pertumbuhan user, traffic, maupun data tanpa harus melakukan perubahan arsitektur secara drastis.

5. Memperluas perspektif dari kode ke sistem

Fokus tidak lagi hanya pada function atau class, tetapi juga pada database, API, network, infrastructure, observability, security, dan dependency antar-service.

6. Meningkatkan komunikasi dalam tim

Diagram arsitektur dan design document membantu engineer menjelaskan keputusan teknis kepada engineer lain, product manager, maupun stakeholder.

7. Mendukung Career Growth

Kemampuan system design semakin penting ketika engineer berkembang dari Junior → Mid-level → Senior → Staff/Principal Engineer, karena tanggung jawabnya semakin banyak berkaitan dengan desain dan keputusan teknis.

F. Contoh Permasalahan dalam System Design

Permasalahan-permasalahan tersebut bukan sekadar teori, tetapi mencerminkan tantangan nyata yang dihadapi engineer dalam pengembangan sistem. Ketika merancang sistem seperti ini, engineer harus mempertimbangkan berbagai aspek, seperti data partitioning, strategi caching, read/write amplification, rate limiting, ketahanan data (data durability), serta isolasi terhadap kegagalan (failure isolation). Setiap kasus juga mengharuskan engineer menentukan trade-off antara kesederhanaan, performa, dan biaya.

Beberapa contoh permasalahan System Design yang umum di dunia nyata antara lain :

1. Merancang URL Shortener yang scalable

Membangun layanan seperti Bitly yang mampu memproses pembuatan dan pengalihan (redirect) URL dalam jumlah sangat besar.

2. Membangun layanan messaging seperti WhatsApp

Merancang sistem yang mampu menangani pengiriman pesan secara real-time, penyimpanan pesan, status online, notifikasi, serta komunikasi antara jutaan hingga miliaran pengguna.

3. Membuat sistem pencocokan (matching) untuk layanan ride-sharing

Merancang mekanisme yang dapat mencocokkan penumpang dengan pengemudi secara cepat berdasarkan lokasi, ketersediaan, dan berbagai faktor lainnya.

4. Merancang arsitektur CDN (Content Delivery Network)

Membangun sistem yang dapat mendistribusikan konten melalui berbagai server di lokasi yang berbeda agar pengguna dapat mengakses konten dengan latensi yang lebih rendah.

5. Merancang sistem checkout untuk e-commerce

Membuat sistem yang mampu menangani keranjang belanja, pembayaran, stok produk, pesanan, hingga konfirmasi transaksi secara aman dan konsisten.

6. Menangani miliaran event analytics

Merancang pipeline yang mampu menerima, memproses, menyimpan, dan menganalisis miliaran event dari aktivitas pengguna secara efisien.

G. Arsitektur Perancangan Sederhana dalam System Design

Arsitektur Perancangan Sederhana dalam System Design [Sumber Gambar : ChatGPT]

Arsitektur perancangan sederhana dalam System Design dapat dipahami sebagai rancangan yang menggambarkan bagaimana pengguna, server, layanan aplikasi, database, serta berbagai komponen pendukung saling berkomunikasi untuk membangun sebuah aplikasi web berskala besar.

Meskipun disebut sederhana, arsitektur pada gambar sebenarnya sudah merepresentasikan arsitektur aplikasi modern yang cukup lengkap, karena mencakup load balancer, application services, cache, message queue, background jobs, monitoring, hingga deployment. Tujuannya adalah memberikan gambaran umum mengenai bagaimana sebuah sistem dirancang agar scalable, reliable, performant, maintainable, dan secure.

1. Gambaran Umum Arsitektur

Secara sederhana, alur sistem pada gambar dapat digambarkan sebagai berikut :

User → Client → DNS → Load Balancer → Web Server → Application Services → Data Layer

Kemudian, terdapat komponen pendukung seperti :

CDN + Cache + Message Queue + Background Jobs + Monitoring & Logging + Deployment

Setiap komponen memiliki tanggung jawab tertentu sehingga sistem dapat bekerja secara terstruktur.

2. Client

Client merupakan perangkat atau aplikasi yang digunakan pengguna untuk mengakses sistem.

Pada gambar terdapat dua jenis client:

  • Web Browser
  • Mobile App

Contohnya, pengguna dapat membuka aplikasi melalui Chrome, Edge, Firefox, atau aplikasi mobile.

Ketika pengguna melakukan suatu aktivitas, misalnya:

Login → melihat produk → memasukkan produk ke keranjang → melakukan order

Client akan mengirimkan HTTP/HTTPS request ke server.

3. DNS — Domain Name System

Setelah pengguna mengakses domain aplikasi, request akan melalui DNS (Domain Name System).

DNS berfungsi menerjemahkan nama domain menjadi alamat IP atau mengarahkan trafik menuju infrastruktur yang tepat.

Contohnya :

Dengan demikian, pengguna tidak perlu mengetahui alamat IP server secara langsung.

4. Load Balancer

Setelah request diarahkan oleh DNS, request dapat diteruskan ke Load Balancer.

Load Balancer berfungsi mendistribusikan traffic dari pengguna ke beberapa server.

Misalnya terdapat 3 (Tiga) Web Server :

Jika terdapat ribuan pengguna, request tidak harus ditangani oleh satu server saja.

Hal ini meningkatkan :

  • Scalability
  • Availability
  • Performance
  • Fault tolerance

Jika salah satu server mengalami masalah, Load Balancer dapat mengarahkan request ke server lainnya.

5. Web Server

Web Server merupakan komponen yang menerima dan menangani HTTP/HTTPS request dari client.

Pada gambar digunakan contoh :

  • Nginx
  • Apache

Web Server dapat bertugas sebagai reverse proxy dan meneruskan request ke Application Services.

Contohnya :

Web Server juga dapat menangani kebutuhan seperti :

  • HTTP/HTTPS
  • Static files
  • Reverse proxy
  • Routing request
  • SSL/TLS termination

6. Application Services

Bagian Application Services merupakan inti dari sistem karena di sinilah business logic aplikasi dijalankan.

Pada gambar, Application Services dibagi menjadi beberapa layanan.

a. Auth Service

Bertanggung jawab terhadap :

  • Authentication
  • Authorization
  • Login
  • Logout
  • Pengelolaan session/token
  • Hak akses pengguna

Contohnya :

b. User Service

Berfungsi mengelola data dan aktivitas pengguna.

Contohnya :

  • Profil pengguna
  • Data akun
  • Informasi pengguna
  • Pengaturan akun

c. Product Service

Bertanggung jawab terhadap pengelolaan produk.

Misalnya :

  • Menampilkan produk
  • Menambah produk
  • Mengubah produk
  • Menghapus produk
  • Mengecek stok
  • Mencari produk

d. Order Service

Berfungsi menangani transaksi atau pesanan.

Contohnya :

Order Service dapat berkomunikasi dengan database maupun layanan lain seperti payment dan notification jika sistem tersebut dikembangkan lebih lanjut.

e. Notification Service

Notification Service menangani pengiriman notifikasi kepada pengguna.

Misalnya:

  • Email
  • Push Notification
  • SMS

Contoh :

7. Data Layer

Data Layer merupakan lapisan yang bertanggung jawab terhadap penyimpanan data.

Pada gambar terdapat tiga komponen utama.

a. Database

Contohnya:

  • MySQL
  • PostgreSQL

Database digunakan untuk menyimpan data yang bersifat persistent.

Misalnya:

  • Users
  • Products
  • Orders
  • Transactions

Application Services akan melakukan operasi seperti ini terhadap database:

  • INSERT
  • SELECT
  • UPDATE
  • DELETE

b. Cache

Pada gambar digunakan Redis sebagai contoh teknologi cache.

Cache digunakan untuk menyimpan data yang sering diakses sehingga aplikasi tidak perlu selalu mengambil data dari database.

Contoh :


Dengan demikian, penggunaan cache dapat mengurangi beban database dan meningkatkan response time.

c. Object Storage

Object Storage digunakan untuk menyimpan file atau objek berukuran besar.

Contohnya :

  • Gambar
  • Video
  • Dokumen
  • Backup
  • File attachment

Pada gambar dicontohkan:

  • AWS S3
  • Cloud Storage

Database biasanya tidak digunakan untuk menyimpan file berukuran besar secara langsung. Database cukup menyimpan metadata atau URL file, sedangkan file disimpan di Object Storage.

8. CDN — Content Delivery Network

CDN digunakan untuk mendistribusikan konten statis ke pengguna dari lokasi server yang lebih dekat dengan mereka.

Contohnya :

  • Cloudflare
  • Amazon CloudFront

Misalnya pengguna berada di Indonesia, CDN dapat menyajikan file dari edge server yang relatif dekat daripada mengambilnya langsung dari server utama.

CDN sangat berguna untuk :

  • Image
  • CSS
  • JavaScript
  • Video
  • Static assets

Sehingga dapat meningkatkan performance dan mengurangi beban Web Server.

9. Message Queue

Pada gambar terdapat Message Queue, dengan contoh :

  • RabbitMQ
  • Apache Kafka

Message Queue digunakan untuk menangani pekerjaan secara asynchronous.

Misalnya ketika pengguna melakukan order :

User tidak harus menunggu proses pengiriman email selesai.

Hal ini membuat aplikasi lebih responsif dan membantu menangani pekerjaan dalam jumlah besar.

10. Background Jobs

Background Jobs digunakan untuk menjalankan pekerjaan yang tidak harus dilakukan secara langsung ketika pengguna menunggu response.

Contohnya :

  • Mengirim email
  • Menghasilkan laporan
  • Memproses gambar
  • Mengolah data
  • Mengirim notifikasi
  • Scheduled tasks
  • Data processing

Komponen ini dapat menggunakan:

  • Worker
  • Scheduler
  • Job Queue

Contohnya :

11. Monitoring & Logging

Sistem berskala besar membutuhkan mekanisme observability agar administrator dan developer dapat mengetahui kondisi sistem.

Pada gambar terdapat 3 komponen, yaitu :

a. Monitoring

Contohnya :

  • Prometheus / Grafana

Digunakan untuk memantau:

  • CPU
  • Memory
  • Request
  • Response time
  • Error rate
  • Server health

b. Logging

Contohnya:

  • ELK Stack / Loki

Digunakan untuk menyimpan dan menganalisis log aplikasi.

c. Alerting

Contohnya :

  • Alertmanager

Digunakan untuk memberikan peringatan ketika terjadi masalah.

Misalnya:

CPU Server mencapai 95%

atau:

Error rate meningkat secara signifikan.

12. Deployment

Bagian Deployment menjelaskan tempat dan cara aplikasi dijalankan.

Pada gambar terdapat :

a. Cloud / On-Premise

Aplikasi dapat dijalankan di:

  • AWS
  • Google Cloud
  • Azure

b. Data Center sendiri

  • Docker / Kubernetes

Docker dapat digunakan untuk melakukan containerization, sedangkan Kubernetes dapat digunakan untuk melakukan orkestrasi container dalam skala besar.

Contoh :

13. Alur Kerja Sistem Secara Keseluruhan

Jika seluruh komponen digabungkan, alur sederhananya adalah:

Sementara pekerjaan asynchronous dapat berjalan melalui :

Dan seluruh sistem dapat diamati melalui :

Monitoring + Logging + Alerting



Itulah Pembahasan mengenai Pengertian, Metode, Cara Merancang, dan Dampak System Design. Mohon maaf apabila ada kesalahan sedikitpun.

Terima Kasih 😄😘👌👍 :)

Wassalamu‘alaikum wr. wb.

Post a Comment

Previous Post Next Post