Tugas 9 PPL - Desain System Aplikasi Instagram
Nama : I Gusti Ngurah Ervan Juli Ardana NRP : 5025211205 Kelas : Perancangan Perangkat Lunak A Tahun : 2024
Pada pertemuan kali ini pada kelas Perancangan Perangkat Lunak A, kami diperkenalkan dengan Desain Sistem Aplikasi Instagram. Pada pertemuan ini, saya akan akan membuat kembali Desain Sistem Aplikasi Instagram
Design System Aplikasi Instagram
Deskripsi Aplikasi
Instagram adalah platform media sosial yang memungkinkan pengguna untuk berbagi foto dan video dengan pengikut mereka. Diluncurkan pada tahun 2010, Instagram telah berkembang menjadi salah satu platform yang paling populer di dunia, dengan lebih dari satu miliar pengguna aktif bulanan pada saat terakhir data tersedia. Aplikasi ini memungkinkan pengguna untuk mengunggah foto dan video dari perangkat mereka, memberikan filter dan efek khusus, serta menambahkan keterangan dan tagar untuk meningkatkan visibilitasnya. Pengguna juga dapat mengatur privasi postingan mereka, memilih untuk membuatnya publik, pribadi, atau hanya terlihat oleh pengikut tertentu. Selain berbagi konten, pengguna Instagram dapat berinteraksi dengan konten yang dibagikan oleh pengguna lain dengan cara seperti menyukai, mengomentari, dan menyimpan postingan. Mereka juga dapat mengirim pesan langsung ke pengguna lain dan berbagi postingan secara pribadi.
Requirements
Kebutuhan Fungsional
Autentikasi Pengguna: Pengguna harus bisa mendaftar dan masuk ke platform dengan aman menggunakan email, nomor telepon, atau akun media sosial mereka.
Manage Profil Pengguna: Setiap pengguna harus memiliki profil yang menampilkan informasi dasar mereka, seperti nama, foto profil, bio, dan informasi kontak.
Posting: Pengguna harus bisa membuat dan membagikan berbagai jenis postingan, seperti foto, video, dan cerita.
News Feed: Pengguna harus memiliki majalah berita personal yang menampilkan konten dari akun yang mereka ikuti, berdasarkan minat dan preferensi mereka.
Pencarian : Pengguna harus bisa menemukan konten dan pengguna baru melalui berbagai fungsionalitas pencarian, seperti pencarian berdasarkan nama pengguna, tagar, atau lokasi.
Suka dan Komentar: Pengguna harus bisa menyukai dan mengomentari postingan yang dibagikan oleh pengguna lain.
Pesan: Pengguna harus bisa berkomunikasi satu sama lain melalui pesan langsung, baik satu lawan satu atau dalam grup.
Privasi dan Keamanan: Privasi dan keamanan pengguna harus dijamin dengan menerapkan langkah-langkah seperti enkripsi data, otentikasi dua faktor, dan moderasi konten.
Notifikasi: Pengguna harus menerima notifikasi waktu nyata untuk tindakan yang terkait dengan akun mereka, seperti suka, komentar, dan pesan.
Analytics and Insights: Platform harus menyediakan pengguna dengan analisis dan wawasan terkait kinerja akun mereka, seperti keterlibatan postingan, pertumbuhan pengikut, dan data demografis.
Business Tools: Instagram juga menawarkan fitur bisnis, seperti iklan dan integrasi e-commerce, yang memungkinkan bisnis untuk mempromosikan produk dan layanan mereka di platform. Fungsionalitas ini harus dirancang dengan memperhatikan kebutuhan bisnis.
Scaling: Sistem harus dirancang untuk menangani lalu lintas dan aktivitas pengguna yang tinggi, karena Instagram memiliki lebih dari 1 miliar pengguna aktif di seluruh dunia. Ini membutuhkan arsitektur yang dapat diskalakan yang dapat menangani volume permintaan dan penyimpanan data yang besar.
Kebutuhan Non-Fungsional
Performa: Sistem harus mampu merespons permintaan pengguna dengan cepat, memastikan waktu tunggu yang sangat singkat.
Skalabilitas: Sistem harus mampu mengelola peningkatan besar dalam jumlah pengguna dan konten, dengan fleksibilitas untuk menambah kapasitasnya.
Keamanan: Sistem harus menjaga keamanan informasi pengguna, termasuk data login, konten yang diunggah, dan pesan pribadi.
Reliabilitas: Sistem harus beroperasi dengan konsistensi dan keandalan tinggi, menjamin ketersediaan yang optimal.
Usability: Antarmuka pengguna harus mudah digunakan dan dirancang dengan baik sehingga interaksi dengan sistem menjadi mudah bagi pengguna.
Berdasarkan requirements diatas, kita dapat menentukan estimasi kapasitas yang dapat digunakan aplikasi instagram.
Estimasi Kapasitas
Estimasi Traffic
Pengguna Aktif Harian: Instagram memiliki lebih dari 1 miliar pengguna aktif bulanan, dengan perkiraan 500 juta pengguna aktif harian. Dengan asumsi peningkatan 20% dalam jumlah pengguna aktif harian dalam setahun ke depan, kita dapat memperkirakan jumlah pengguna aktif harian menjadi 600 juta.
Pengguna Aktif Harian Saat Ini: 500 juta
Perkiraan Peningkatan (20%): 500 juta * 20% = 100 juta
Jumlah Pengguna Aktif Harian dalam Setahun ke Depan: 500 juta + 100 juta = 600 juta
Posting Harian: Berdasarkan statistik saat ini, pengguna Instagram membagikan sekitar 100 juta foto dan video setiap hari. Dengan asumsi peningkatan 20% dalam setahun ke depan, kita dapat memperkirakan jumlah postingan harian menjadi 120 juta.
Jumlah Postingan Harian Saat Ini: 100 juta
Perkiraan Peningkatan (20%): 100 juta * 20% = 20 juta
Jumlah Postingan Harian dalam Setahun ke Depan: 100 juta + 20 juta
= 120 juta
Maka dari itu kita dapat menentukan, request per detik (RPS) yang harus ditangani
oleh sistem :
Estimasi RPS untuk Posting Foto dan Video:
RPS=(Jumlah Postingan Harian)/(Jumlah Detik dalam Sehari)
RPS=120,000,000/86,400
RPS≈1,389
Pesan Harian: Pengguna Instagram mengirim sekitar 10 miliar pesan langsung per bulan. Dengan asumsi bahwa setiap pengguna mengirim rata-rata 10 pesan per hari, kita dapat memperkirakan jumlah pesan harian menjadi 100 miliar.
Jumlah Pesan Langsung per Pengguna per Hari: 10
Jumlah Pengguna Aktif Harian: 600 juta
Jumlah Pesan Harian: 600 juta * 10 = 6 miliar
Jumlah Pesan Harian (dalam miliar): 6 miliar / 1000 = 100 miliar
Maka dari itu kita dapat menentukan, request per detik (RPS) yang harus ditangani
oleh sistem :
Estimasi RPS untuk Pengiriman Pesan Langsung:
RPS=(Jumlah Pesan Harian)/(Jumlah Detik dalam Sehari)
RPS=100,000,000,000/86,400
RPS≈1,157,407
Estimasi Storage
Dengan mengasumsikan ukuran foto rata-rata sebesar 500 KB dan ukuran video sebesar 50 MB, total penyimpanan yang diperlukan untuk postingan harian akan menjadi 6 PB. Dengan mengasumsikan ukuran pesan rata-rata sebesar 1 KB, total penyimpanan yang diperlukan untuk pesan harian akan menjadi 100 TB.
Ukuran Rata-rata Foto: 500 KB
Ukuran Rata-rata Video: 50 MB
Ukuran Foto dalam Byte: 500 KB * 1024 = 512,000 bytes
Ukuran Video dalam Byte: 50 MB * 1024 * 1024 = 52,428,800 bytes
Total Penyimpanan untuk Postingan Harian: (Jumlah Foto * Ukuran Foto) + (Jumlah Video * Ukuran Video) = (120 juta * 512,000 bytes) + (120 juta * 52,428,800 bytes) = 6 PB
Ukuran Rata-rata Pesan: 1 KB
Total Penyimpanan untuk Pesan Harian: Jumlah Pesan * Ukuran Pesan = 100 miliar * 1 KB
= 100 TB
Estimasi Bandwidth
Dengan mengasumsikan tingkat unggah foto rata-rata sebesar 50 Mbps dan tingkat unggah video sebesar 500 Mbps, total bandwidth yang diperlukan untuk postingan harian akan sekitar 6 Tbps. Dengan mengasumsikan tingkat unggah pesan rata-rata sebesar 1 Mbps, total bandwidth yang diperlukan untuk pesan harian akan sekitar 100 Gbps.
Tingkat Unggah Rata-rata Foto: 50 Mbps
Tingkat Unggah Rata-rata Video: 500 Mbps
Total Bandwidth untuk Postingan Harian: (Jumlah Foto * Tingkat Unggah Foto) + (Jumlah Video * Tingkat Unggah Video) = (120 juta * 50 Mbps) + (120 juta * 500 Mbps) = 6 Tbps
Tingkat Unggah Rata-rata Pesan: 1 Mbps
Total Bandwidth untuk Pesan Harian: Jumlah Pesan * Tingkat Unggah Pesan = 100 miliar * 1 Mbps
= 100 Gbps
Use Case Diagram
Jika pengguna baru, mereka akan mendaftar terlebih dahulu, kemudian disimpan di database, mereka akan memverifikasi profilnya.
Jika pengguna sudah mendaftar, mereka akan memberikan Id email dan Kata Sandi.
Di halaman beranda mereka akan mendapatkan foto dan video, serta halaman cerita.
Postingan yang diposting sekarang, akan muncul di bagian atas. Pengguna dapat mengikuti atau berhenti mengikuti orang tersebut. Pengguna bisa siaran langsung. Itu semua tergantung pada mereka.
Akan ada pengaturan, di mana pengguna dapat melihat cerita masa lalu atau postingan yang telah diarsipkan. Pengguna dapat membuka blokir orang yang bisa mendapatkan akun terverifikasi, setelah membayar.
High-Level Design
Komponen Sistem
Client — Ini adalah aplikasi mobile/desktop yang akan terhubung ke server backend melalui REST API yang didefinisikan di atas.
Load Balancer — Kita akan menggunakan load balancer untuk mendistribusikan lalu lintas antara server yang berbeda. Ini akan membuat sistem kita lebih tersedia dan jika sebuah server mengalami masalah di belakang load balancer, load balancer dapat mendistribusikan lalu lintas ke server yang lain.
Image Service — Image service bertanggung jawab menyediakan API untuk mengunggah gambar dan mendapatkan metadata gambar. API metadata akan mengembalikan jalur gambar di S3 yang akan digunakan oleh klien untuk memuat gambar di aplikasi mereka.
S3 — Kami menggunakan penyimpanan objek untuk menyimpan gambar yang diunggah oleh pengguna. AWS S3 adalah penyimpanan objek yang skalabel dan murah yang bisa kita gunakan di sini. Kami dapat mengintegrasikannya dengan AWS CloudFront sehingga gambar dapat ditampilkan lebih cepat di aplikasi pengguna.
CloudFront — Amazon CloudFront adalah layanan jaringan pengiriman konten (CDN) yang dibangun untuk kinerja tinggi, keamanan, dan kemudahan pengembang. Dengan bantuan CloudFront, gambar akan ditampilkan lebih cepat di aplikasi pengguna.
Image DDB — Kami menggunakan AWS Dynamo DB untuk menyimpan metadata gambar yang diunggah oleh pengguna. Kami telah membahas tentang ini di bagian atas.
SNS — Pada setiap unggahan pengguna, kami menerbitkan pemberitahuan dengan bantuan AWS Simple Notification Service. Ini akan berguna dalam pemrosesan lainnya seperti pemantauan, pembuatan feed, analitik, dll. Berbagai SQS dapat berlangganan ke SNS ini untuk mendengarkan event.
SQS — Kami menggunakan AWS Simple Queue Service yang akan berlangganan ke event unggahan SNS dan layanan pembuatan feed akan mendengarkan SQS ini untuk memproses event.
Feed Generation Service — Layanan ini bertanggung jawab untuk pembuatan feed pengguna. Layanan ini akan mendengarkan event unggahan pengguna melalui SQS dan memulai proses untuk pembuatan feed pengguna. Layanan ini akan menangani jutaan event dan bisa ada diskusi terpisah tentang Desain Tingkat Rendah untuk layanan ini. Kami akan membahasnya di artikel mendatang.
Feed DDB — Kami menggunakan Dynamo DB untuk menyimpan data feed pengguna. Layanan pembuatan feed akan berinteraksi dengan DDB untuk memperbarui feed pengguna.
Redis Cache — Untuk menjaga latensi baca tetap rendah bagi pengguna kami, kami menerapkan lapisan caching di antara layanan pembuatan feed dan DDB. Ketika permintaan datang untuk mengambil feed pengguna, pertama-tama akan diperiksa di cache redis, jika tidak tersedia maka akan diambil dari DDB dan mengembalikan respons.
Interaksi Pengguna
Pembuatan Konten oleh Pengguna:
Pengguna mengunggah foto atau video melalui aplikasi seluler.
Aplikasi seluler mengirimkan permintaan ke server web.
Server web menyimpan konten ke dalam penyimpanan dan basis data.
Pengguna Mengakses Konten:
Pengguna membuka aplikasi seluler dan melihat feed.
Aplikasi seluler mengirimkan permintaan ke server web.
Server web mengambil konten dari basis data dan penyimpanan.
Server web mengirimkan konten ke aplikasi seluler.
Interaksi Pengguna dengan Konten:
Pengguna memberikan like, komentar, atau membagikan konten.
Aplikasi seluler mengirimkan permintaan ke server web.
Server web memperbarui basis data dengan interaksi pengguna tersebut.
Pencarian Konten Baru oleh Pengguna:
Pengguna memasukkan kata kunci pencarian di aplikasi seluler.
Aplikasi seluler mengirimkan permintaan ke server web.
Server web mencari konten dalam basis data berdasarkan kata kunci tersebut.
Server web mengirimkan hasil pencarian ke aplikasi seluler.
Pengiriman Pesan Pribadi oleh Pengguna:
Pengguna membuka fitur Direct Messaging di aplikasi seluler.
Aplikasi seluler mengirimkan permintaan ke server web.
Server web mengambil pesan dari basis data.
Server web mengirimkan pesan ke aplikasi seluler.
Pengelolaan Koneksi dengan Pengguna Lain:
Pengguna mengikuti atau berhenti mengikuti pengguna lain.
Aplikasi seluler mengirimkan permintaan ke server web.
Server web memperbarui basis data dengan informasi koneksi pengguna tersebut.
Pemantauan Aktivitas Akun oleh Pengguna:
Pengguna melihat statistik tentang pengikut, like, dan komentar.
Aplikasi seluler mengirimkan permintaan ke server web.
Server web mengambil data dari basis data.
Server web mengirimkan data tersebut ke aplikasi seluler.
4o
Low-Level Design
Berikut adalah rincian komponen dan interaksi utama dalam desain tingkat rendah Instagram:
Layanan Pengguna:
Mengelola pendaftaran pengguna, login, otentikasi, dan pengelolaan profil.
Menyimpan informasi pengguna seperti nama pengguna, email, bio, dan gambar profil.
Terintegrasi dengan penyedia otentikasi sosial seperti Facebook dan Google.
Layanan Postingan:
Mengurus pengunggahan, pengeditan, dan penghapusan foto dan video.
Menyimpan metadata posting seperti keterangan, tagar, lokasi, dan stempel waktu.
Memproses media yang diunggah untuk perubahan ukuran, penyaringan, dan pembuatan thumbnail.
Mengelola transcoding foto dan video untuk berbagai perangkat dan resolusi.
Layanan Umpan:
Menghasilkan feed berita yang dipersonalisasi untuk setiap pengguna berdasarkan pengikut, suka, aktivitas, dan keterlibatan.
Menggunakan sistem terdistribusi seperti Apache Kafka atau RabbitMQ untuk pembaruan dan notifikasi waktu nyata.
Menggunakan lapisan cache seperti Redis untuk pengambilan feed yang cepat dan mengurangi beban pada database.
Layanan Penyimpanan:
Menyimpan foto dan video yang diunggah dengan efisien dan andal.
Memanfaatkan solusi penyimpanan objek yang skalabel seperti Amazon S3, Google Cloud Storage, atau Azure Blob Storage.
Menerapkan mekanisme redundansi dan pemulihan bencana untuk perlindungan data.
Layanan Pencarian:
Memungkinkan pencarian pengguna, tagar, dan lokasi.
Mengindeks pengguna, postingan, dan tagar berdasarkan parameter relevan.
Menggunakan algoritma pengindeksan dan pencarian yang efisien untuk hasil yang cepat dan akurat.
Layanan Komentar:
Mengelola penambahan, pengeditan, dan penghapusan komentar pada postingan.
Melacak rangkaian komentar dan hubungan induk-anak.
Memberi tahu pengguna tentang komentar baru pada postingan mereka atau komentar yang mereka ikuti.
Layanan Notifikasi:
Memberi tahu pengguna tentang peristiwa penting seperti suka, komentar, sebutan, dan pengikut baru.
Mengirim notifikasi ke perangkat seluler melalui platform seperti Firebase Cloud Messaging atau Amazon SNS.
Menggunakan sistem antrian untuk pengiriman notifikasi secara asinkron.
Layanan Analisis:
Melacak keterlibatan pengguna, kinerja postingan, dan penggunaan platform secara keseluruhan.
Mengumpulkan data tentang tampilan, suka, komentar, berbagi, dan klik.
Menyediakan wawasan untuk meningkatkan pengalaman pengguna, mengoptimalkan rekomendasi konten, dan menargetkan iklan.
-
Desain Basis Data
Skema Database
Implementasi Database
-- Create User Table
CREATE TABLE Users (
UserID SERIAL PRIMARY KEY,
Username VARCHAR(255) NOT NULL,
Email VARCHAR(255) NOT NULL,
PasswordHash VARCHAR(255) NOT NULL,
ProfilePicture VARCHAR(255),
Bio TEXT,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Create Post Table
CREATE TABLE Posts (
PostID SERIAL PRIMARY KEY,
UserID INT NOT NULL,
ContentURL VARCHAR(255),
Caption TEXT,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (UserID) REFERENCES Users(UserID)
);
-- Create Comment Table
CREATE TABLE Comments (
CommentID SERIAL PRIMARY KEY,
PostID INT NOT NULL,
UserID INT NOT NULL,
Content TEXT NOT NULL,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (PostID) REFERENCES Posts(PostID),
FOREIGN KEY (UserID) REFERENCES Users(UserID)
);
-- Create Like Table
CREATE TABLE Likes (
LikeID SERIAL PRIMARY KEY,
PostID INT NOT NULL,
UserID INT NOT NULL,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (PostID) REFERENCES Posts(PostID),
FOREIGN KEY (UserID) REFERENCES Users(UserID)
);
-- Create Follow Table
CREATE TABLE Follows (
FollowerID INT NOT NULL,
FolloweeID INT NOT NULL,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (FollowerID, FolloweeID),
FOREIGN KEY (FollowerID) REFERENCES Users(UserID),
FOREIGN KEY (FolloweeID) REFERENCES Users(UserID)
);
Penjelasan Implementasi
User Table
UserID (Primary Key): Ini adalah pengenal unik untuk setiap pengguna.
Username: Nama tampilan pengguna.
Email: Alamat email pengguna untuk kontak dan login.
PasswordHash: Kata sandi yang di-hash dengan aman untuk otentikasi pengguna.
ProfilePicture: Ini adalah URL atau referensi ke foto profil pengguna.
Bio: Bio profil pengguna.
CreatedAt: Stempel waktu saat akun pengguna dibuat.
Post Table
PostID (Primary Key): Ini adalah pengenal unik untuk setiap postingan.
UserID: Pengenal untuk pengguna yang membuat postingan.
ContentURL: Ini adalah URL atau referensi ke foto atau video.
Caption: Teks keterangan yang menyertai postingan.
CreatedAt: Ini adalah stempel waktu saat postingan dibuat.
Comment Table
CommentID (Primary Key): Ini adalah pengenal unik untuk setiap komentar.
PostID: Pengenal untuk postingan terkait.
UserID: Pengenal untuk pengguna yang membuat komentar.
Content: Konten teks dari komentar.
CreatedAt: Stempel waktu saat komentar dibuat.
Like Table
LikeID (Primary Key): Ini adalah pengenal unik untuk setiap suka.
PostID: Pengenal untuk postingan yang disukai.
UserID: Pengenal untuk pengguna yang menyukai postingan.
CreatedAt: Stempel waktu saat suka dibuat.
Follow Table
FollowerID: Pengenal untuk pengguna yang mengikuti.
FolloweeID: Pengenal untuk pengguna yang diikuti.
CreatedAt: Stempel waktu saat hubungan mengikuti dibuat.
Desain API
signup (username, firstname, lastname, saltedpasswordhash, phone_number, email, bio, photo): menambahkan pengguna ke tabel pengguna
login (username, saltedpasswordhash): masuk pengguna dan memperbarui waktu login terakhir
search_user (searchstring, authtoken): mengembalikan data pengguna publik untuk string pencarian yang diberikan (dapat dicari dalam nama depan, nama belakang, dan nama pengguna)
getuserby_id (userid, authtoken): mengembalikan data pengguna publik untuk ID pengguna yang diberikan
follow_user (userid, targetuserid, authtoken): menambahkan data pengikut ke database
add_post (file, caption, userid, authtoken): mengunggah file ke server penyimpanan file
delete_post (userid, postid, auth_token): menghapus postingan pengguna yang diberikan beserta metadata-nya (menggunakan penghapusan lunak)
get_feed (userid, count, offset, timestamp, authtoken): mengembalikan postingan teratas setelah stempel waktu yang diberikan dari pengguna yang diikuti oleh pengguna yang diberikan sesuai dengan jumlah dan offset
getuserposts (userid, count, offset, authtoken): mengembalikan postingan dari pengguna yang diberikan sesuai dengan jumlah dan offset
post_like (userid, postid, auth_token): menambahkan ID postingan yang diberikan ke suka pengguna yang diberikan
post_unlike (userid, postid, auth_token): menghapus ID postingan yang diberikan dari suka pengguna yang diberikan
add_comment (userid, postid, comment): menambahkan komentar pada postingan yang diberikan oleh pengguna yang diberikan
delete_comment (userid, commentid): menghapus komentar pengguna yang diberikan dengan ID komentar yang diberikan
Load Balancing
Untuk menangani permintaan pengguna, instagram perlu menggunakan Load Balancer untuk mendistribusikan permintaan diantara server aplikasi. Salah satu cara untuk melakukannya adalah dengan menggunakan teknik round-robin, di mana permintaan didistribusikan secara bergiliran. Namun, pendekatan ini bisa bermasalah jika ada server yang tidak tersedia, karena permintaan mungkin masih dikirim ke server tersebut. Untuk mencegah hal ini, instagram dapat menerapkan sistem "heartbeat" di mana setiap server mengirimkan sinyal ke penyeimbang beban pada interval yang telah ditetapkan untuk menunjukkan bahwa server tersebut masih aktif.
Load Balancer juga diperlukan untuk server database dan cache, yang mungkin juga didistribusikan. Untuk mengarahkan permintaan ke server yang tepat, kita dapat menggunakan teknik yang disebut hashing konsisten. Teknik ini melibatkan pemetaan setiap permintaan ke server tertentu berdasarkan informasi spesifik pengguna. Ini membantu memastikan bahwa permintaan diarahkan ke server yang benar dan beban didistribusikan secara merata.
Referensi :
Komentar
Posting Komentar