PPL: Pertemuan 13 Tugas 9

Desain Sistem Aplikasi Instagram

Nama: Hanafi Satriyo Utomo Setiawan
NRP : 5025211195 

Instagram adalah layanan jejaring sosial berbagi foto dan video dari Amerika yang dimiliki oleh Meta Platforms. Layanan ini memungkinkan pengguna mengunggah media yang dapat diedit dengan filter, diatur dengan tagar, dan dihubungkan dengan lokasi melalui penandaan geografis. Posting dapat dibagikan secara publik atau dengan pengikut yang telah disetujui sebelumnya.

Persyaratan Fungsional

  • Mengunggah foto dan video: Pengguna dapat mengunggah foto dan video di Instagram.
  • Mengikuti dan berhenti mengikuti pengguna: Pengguna dapat mengikuti dan berhenti mengikuti pengguna lain di Instagram.
  • Menyukai atau tidak menyukai postingan: Pengguna dapat menyukai atau tidak menyukai postingan dari akun yang mereka ikuti.
  • Mencari foto dan video: Pengguna dapat mencari foto dan video berdasarkan keterangan dan lokasi.
  • Menghasilkan umpan berita: Pengguna dapat melihat umpan berita yang terdiri dari foto dan video (dalam urutan kronologis) dari semua pengguna yang mereka ikuti.

Persyaratan Non-Fungsional untuk Desain Sistem Instagram

  • Skalabilitas: Sistem harus dapat diskalakan untuk menangani jutaan pengguna dalam hal sumber daya komputasi dan penyimpanan.
  • Latensi: Latensi untuk menghasilkan umpan berita harus rendah.
  • Ketersediaan: Sistem harus sangat tersedia.
  • Daya Tahan: Konten yang diunggah (foto dan video) tidak boleh hilang.
  • Konsistensi: Dapat diterima jika konten (foto atau video).
  • Keandalan: Sistem harus mampu menahan kegagalan perangkat keras dan perangkat lunak.

High Level Design

High Level Design



Arsitektur:

Arsitektur Instagram terdiri dari tiga komponen utama:

  • Client: Aplikasi mobile Instagram yang digunakan oleh pengguna untuk mengakses platform.
  • App Server: Server backend yang bertanggung jawab untuk menyimpan dan memproses data Instagram.
  • Database: Database yang menyimpan data Instagram, seperti foto, video, dan informasi pengguna.

Alur Data:

  1. Pengguna:

    • Mengunggah foto atau video ke aplikasi Instagram.
    • Memberikan metadata terkait foto atau video, seperti judul dan deskripsi.
  2. Client:

    • Mengirimkan foto atau video dan metadata ke App Server.
    • Meminta data dari App Server, seperti feed pengguna lain dan daftar pengikut.
  3. App Server:

    • Menerima foto atau video dan metadata dari Client.
    • Menyimpan foto atau video ke Object Storage.
    • Menyimpan metadata ke Metadata DB.
    • Mengirimkan pemberitahuan ke Message Consumer jika ada postingan baru.
    • Memproses permintaan data dari Client.
    • Mengirimkan data yang diminta ke Client.
  4. Message Consumer:

    • Menerima pemberitahuan dari App Server tentang postingan baru.
    • Memperbarui Feed Generation Service dengan informasi postingan baru.
  5. Feed Generation Service:

    • Menerima informasi postingan baru dari Message Consumer.
    • Menghasilkan feed pengguna berdasarkan informasi postingan baru.
    • Menyimpan feed pengguna ke Cache.
  6. Cache:

    • Menyimpan feed pengguna yang telah dihasilkan oleh Feed Generation Service.
    • Menyediakan feed pengguna yang di-cache ke App Server.

Penjelasan:

  • Client: Client adalah aplikasi mobile Instagram yang digunakan oleh pengguna untuk mengakses platform. Client bertanggung jawab untuk menampilkan foto dan video kepada pengguna, memungkinkan pengguna untuk mengunggah foto dan video, dan memproses interaksi pengguna dengan platform.

  • App Server: App Server adalah server backend yang bertanggung jawab untuk menyimpan dan memproses data Instagram. App Server menerima foto dan video dari Client, menyimpannya ke Object Storage, dan menyimpan metadatanya ke Metadata DB. App Server juga memproses permintaan data dari Client dan mengirimkan data yang diminta.

  • Database: Database menyimpan data Instagram, seperti foto, video, dan informasi pengguna. Metadata DB menyimpan metadata foto dan video, seperti judul dan deskripsi. Object Storage menyimpan foto dan video itu sendiri.


Database Design




Data pengguna - Metadata yang relevan dengan pengguna aplikasi
Foto - Data terkait dengan posting/foto yang diunggah pengguna
Pengikut pengguna - Menyimpan hubungan antara Pengguna ke Pengguna

Atribut spesifik dari data tersebut meliputi:
  • Entri foto dapat ditelusuri ke pengguna tertentu
  • Pengikut pengguna memiliki pemetaan 1:1
  • Tabel foto hanya akan menyimpan metadata dan konten dapat direferensikan melalui jalur URL
Dengan mempertimbangkan persyaratan fungsional, yang memprioritaskan kueri relasional antara foto, pengguna, dan pengikut, kita dapat menyimpan data dengan mempertahankan tabel terpisah untuk setiap jenis data dengan referensi kunci asing di antara mereka.

Layanan backend akan melakukan operasi JOIN pada tabel pengikut dan foto untuk menghasilkan umpan untuk setiap permintaan pengguna unik.

Instagram sangat bergantung pada hubungan antara jenis data ini untuk mendukung pengambilan umpan pengguna. Kueri umum adalah mengambil semua foto untuk sekelompok pengguna (yang diikuti). Karena itu, masuk akal untuk menggunakan Basis Data SQL untuk menampung model data yang ada.

  • Tabel Pengguna

    • id: (primary key, int, serial) Ini adalah pengenal unik untuk setiap pengguna di platform.
    • name: (string) Ini menyimpan nama pengguna.
    • email: (string) Ini menyimpan alamat email pengguna.
    • location: (string) Ini menyimpan lokasi pengguna (opsional).
  • Tabel Foto

    • id: (primary key, int, serial) Ini adalah pengenal unik untuk setiap foto yang diunggah.
    • user_id: (foreign key yang mereferensikan User.id) Ini menghubungkan foto ke pengguna yang mengunggahnya.
    • location: (string) Ini menyimpan lokasi pengambilan foto (opsional).
    • path: (string) Ini menyimpan jalur file atau URL untuk foto di server.
    • caption: (string) Ini menyimpan caption atau deskripsi yang ditambahkan ke foto oleh pengguna.
  • Tabel Ikuti

    • from: (primary key, int, serial) Ini adalah foreign key yang mereferensikan ID pengguna (pengikut).
    • to: (foreign key yang mereferensikan User.id) Ini adalah foreign key yang mereferensikan ID pengguna yang diikuti.

Hubungan Antar Tabel

  • Satu Pengguna ke Banyak Foto: Seorang pengguna dapat mengunggah banyak foto. Hubungan ini tercermin oleh foreign key user_id di tabel Foto yang mereferensikan primary key id di tabel Pengguna.
  • Banyak Pengguna ke Banyak Pengguna: Seorang pengguna dapat mengikuti banyak pengguna lain, dan seorang pengguna dapat diikuti oleh banyak pengguna lain. Hubungan many-to-many ini biasanya diimplementasikan menggunakan tabel terpisah seperti Tabel Ikuti di sini, di mana setiap record mewakili hubungan mengikuti antara dua pengguna.


Capacity Estimation

Kita akan memperkirakan jumlah penyimpanan yang dibutuhkan untuk menampung data pengguna selama satu tahun.

  • 10 juta Pengguna Aktif Bulanan 
  • 2 Foto diunggah per bulan 
  • 5MB per foto 

Hasil: 10^7 * 2 * 5MB = 10^8MB = 100TB per bulan = 1,2PB per tahun

Selanjutnya, kita akan menghitung perkiraan angka QPS (Query Per Second) untuk sistem.

  • 10 juta Pengguna Aktif Bulanan 
  • ~3 juta Pengguna Aktif Harian 

Write QPS: ~600 ribu unggahan foto = 6*10^5/86400 = ~10 unggahan per detik

Read QPS: 10 pembacaan per hari * 3 juta Pengguna Aktif Harian / 86400 = ~350 pembacaan per detik


referensi:
https://www.tryexponent.com/courses/system-design-interviews/mock-interview-design-instagram
https://www.geeksforgeeks.org/design-instagram-a-system-design-interview-question/

Comments

Popular posts from this blog

PPL : Pertemuan 2

PPL : Pertemuan 7

Final Project : Pemrograman Berbasis Kerangka Kerja A