PPL: Pertemuan 13 Tugas 9
Desain Sistem Aplikasi Instagram
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
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:
Pengguna:
- Mengunggah foto atau video ke aplikasi Instagram.
- Memberikan metadata terkait foto atau video, seperti judul dan deskripsi.
Client:
- Mengirimkan foto atau video dan metadata ke App Server.
- Meminta data dari App Server, seperti feed pengguna lain dan daftar pengikut.
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.
Message Consumer:
- Menerima pemberitahuan dari App Server tentang postingan baru.
- Memperbarui Feed Generation Service dengan informasi postingan baru.
Feed Generation Service:
- Menerima informasi postingan baru dari Message Consumer.
- Menghasilkan feed pengguna berdasarkan informasi postingan baru.
- Menyimpan feed pengguna ke Cache.
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
- 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
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 keyid
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
Post a Comment