Tugas 9 PPL - A
Nama : Tsabita Putri Ramadhany
NRP : 5025211130
Kelas : PPL - A
Tugas 9
Desain System Aplikasi Instagram
Tugas : Desain System Aplikasi Instagram
Petunjuk Tugas : https://kuliahppl.blogspot.com/2024/06/desain-system-aplikasi-instagram.html
1. Apa itu Instagram?
Instagram adalah layanan jejaring sosial berbagi foto dan video asal Amerika yang dimiliki oleh Meta Platforms. Aplikasi ini memungkinkan pengguna untuk mengunggah media yang dapat diedit dengan filter, diatur dengan hashtag, dan dihubungkan dengan lokasi melalui geotagging. Postingan dapat dibagikan secara publik atau hanya dengan pengikut yang sudah disetujui.
2. Spesifikasi Kebutuhan untuk Desain Sistem Instagram
2.1 Kebutuhan Fungsional untuk Desain Sistem Instagram
Dalam kebutuhan fungsional, kita tidak akan membahas halaman login atau signup Instagram karena arsitektur login dan signup sama untuk semua aplikasi. Fokus kita adalah pada fitur-fitur seperti mengunggah foto, dll.
- 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.
- Membuat Feed Berita: Pengguna dapat melihat feed berita yang terdiri dari foto dan video (dalam urutan kronologis) dari semua pengguna yang mereka ikuti.
2.2 Kebutuhan 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 feed berita harus rendah.
- Ketersediaan: Sistem harus sangat tersedia.
- Durabilitas: Konten yang diunggah (foto dan video) tidak boleh hilang.
- Konsistensi: Kita bisa sedikit mengorbankan konsistensi. Tidak masalah jika konten (foto atau video) memerlukan waktu untuk ditampilkan di feed pengikut yang berada di daerah yang jauh.
- Keandalan: Sistem harus mampu menoleransi kegagalan perangkat keras dan perangkat lunak.
3. Estimasi Kapasitas untuk Desain Sistem Instagram
Kita memiliki 1 miliar pengguna, dengan 500 juta pengguna aktif harian. Diasumsikan 60 juta foto dan 35 juta video dibagikan di Instagram setiap hari. Kita dapat mempertimbangkan 3 MB sebagai ukuran maksimum setiap foto dan 150 MB sebagai ukuran maksimum setiap video yang diunggah di Instagram. Rata-rata, setiap pengguna mengirim 20 permintaan (dari jenis apa pun) per hari ke layanan kita.
3.1 Penyimpanan Per Hari
- Foto: 60 juta foto/hari * 3 MB = 180 Terabyte / hari
- Video: 35 juta video/hari * 150 MB = 5250 Terabyte / hari
- Total Ukuran Konten: 180 TB + 5250 TB = 5430 TB
- Total Ruang yang Dibutuhkan untuk Setahun: 5430 TB/hari * 365 (hari per tahun) = 1981950 TB = 1981.95 Petabyte
3.2 Estimasi Bandwidth
- 5430 TB/(24 * 60 * 60) = 5430 TB/86400 detik ~= 62.84 GB/s ~= 502.8 Gbps
- Bandwidth Masuk ~= 502.8 Gbps
- Rasio pembaca terhadap penulis adalah 100:1.
- Bandwidth Keluar yang Dibutuhkan ~= 100 * 502.8 Gbps ~= 50.28 Tbps
4. Use Case Diagram untuk Desain Sistem Instagram
Dalam diagram di atas, kita telah membahas tentang diagram use case Instagram:
- Jika pengguna baru, mereka akan mendaftar terlebih dahulu yang akan disimpan dalam database, mereka akan memverifikasi profil.
- Jika pengguna sudah mendaftar, mereka akan memberikan email-Id dan Kata Sandi.
- Di halaman utama 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 lain. Pengguna dapat melakukan live streaming.
- Akan ada pengaturan, di mana pengguna dapat melihat cerita masa lalu mereka atau postingan yang telah diarsipkan. Pengguna dapat membuka blokir orang lain dan mendapatkan akun terverifikasi setelah membayar.
5. Desain Level Rendah (Low-Level Design) untuk Desain Sistem Instagram
Berikut adalah rincian dari komponen dan interaksi utama untuk desain level rendah Instagram:
Layanan Pengguna (User Service):
- Menangani pendaftaran pengguna, login, otentikasi, dan manajemen profil.
- Menyimpan data pengguna seperti nama pengguna, email, bio, foto profil, dll.
- Integrasi dengan penyedia otentikasi sosial (misalnya, Facebook, Google).
Layanan Postingan (Post Service):
- Menangani unggahan, pengeditan, dan penghapusan foto dan video.
- Menyimpan metadata postingan seperti caption, hashtag, lokasi, timestamp, dll.
- Memproses media yang diunggah untuk mengubah ukuran, filter, dan pembuatan thumbnail.
- Mengelola transcoding foto dan video untuk perangkat dan resolusi yang berbeda.
Layanan Feed (Feed Service):
- Menghasilkan feed berita yang dipersonalisasi untuk setiap pengguna berdasarkan pengikut, like, aktivitas, dan keterlibatan mereka.
- Memanfaatkan sistem terdistribusi seperti Apache Kafka atau RabbitMQ untuk pembaruan dan notifikasi real-time.
- Menggunakan layer cache seperti Redis untuk pengambilan feed yang cepat dan mengurangi beban database.
Layanan Penyimpanan (Storage Service):
- Menyimpan foto dan video yang diunggah dengan efisien dan andal.
- Menggunakan solusi penyimpanan objek yang dapat diskalakan seperti Amazon S3, Google Cloud Storage, atau Azure Blob Storage.
- Menerapkan mekanisme redundansi dan pemulihan bencana untuk perlindungan data.
Layanan Pencarian (Search Service):
- Memungkinkan pencarian pengguna, hashtag, dan lokasi.
- Mengindeks pengguna, postingan, dan hashtag berdasarkan parameter yang relevan.
- Menggunakan algoritma pengindeksan dan pencarian yang efisien untuk hasil yang cepat dan akurat.
Layanan Komentar (Comment Service):
- Menangani penambahan, pengeditan, dan penghapusan komentar pada postingan.
- Melacak thread komentar dan hubungan parent-child.
- Memberi tahu pengguna tentang komentar baru pada postingan mereka sendiri atau komentar yang mereka ikuti.
Layanan Notifikasi (Notification Service):
- Memberi tahu pengguna tentang peristiwa relevan seperti like, komentar, mention, dan follow.
- Mengirim notifikasi ke perangkat mobile melalui platform seperti Firebase Cloud Messaging atau Amazon SNS.
- Memanfaatkan sistem antrian untuk pengiriman notifikasi secara asinkron.
Layanan Analitik (Analytics Service):
- Melacak keterlibatan pengguna, kinerja postingan, dan penggunaan platform secara keseluruhan.
- Mengumpulkan data tentang tampilan, like, komentar, share, dan klik.
- Memberikan wawasan untuk meningkatkan pengalaman pengguna, mengoptimalkan rekomendasi konten, dan menargetkan iklan.
Mengapa kita membutuhkan caching untuk menyimpan data?
- Cache data untuk menangani jutaan pembacaan. Ini meningkatkan pengalaman pengguna dengan membuat proses pengambilan cepat.
- Kita juga akan menggunakan lazy loading, yang meminimalkan waktu tunggu klien.
- Ini memungkinkan kita memuat konten saat pengguna menggulir dan dengan demikian menghemat bandwidth dan fokus pada pemuatan konten yang sedang dilihat pengguna. Ini meningkatkan latensi untuk melihat atau mencari foto atau video tertentu di Instagram.
6. Desain Level Tinggi (High-Level Design) untuk Desain Sistem Instagram
Sistem kita harus memungkinkan kita untuk mengunggah, melihat, dan mencari gambar dan video pada tingkat tinggi. Untuk mengunggah gambar dan video, kita perlu menyimpannya, dan saat mengambil, kita perlu mengambil data dari penyimpanan. Selain itu, pengguna juga harus diizinkan untuk saling mengikuti.
Pada tingkat tinggi, Instagram dapat dilihat sebagai sistem dengan komponen dan interaksi utama berikut:
Komponen:
- Klien: Aplikasi mobile, aplikasi web, dan API yang menyediakan antarmuka bagi pengguna untuk berinteraksi dengan sistem.
- Otentikasi & Otorisasi: Menangani login pengguna, pendaftaran, dan kontrol akses.
- Manajemen Konten: Mengelola konten yang dihasilkan pengguna seperti foto, video, live streaming, cerita, dan pesan.
- Pembuatan Feed: Memersonalisasi feed berita untuk setiap pengguna berdasarkan pengikut, aktivitas, dan keterlibatan mereka.
- Graf Sosial: Melacak hubungan antar pengguna (mengikuti, pengikut, teman).
- Penemuan & Pencarian: Memungkinkan pencarian pengguna, hashtag, lokasi, dan konten.
- Notifikasi: Memberi tahu pengguna tentang peristiwa relevan seperti like, komentar, mention, dan follow.
- Analitik & Pelaporan: Melacak keterlibatan pengguna, kinerja konten, dan penggunaan platform secara keseluruhan.
Interaksi:
Pengguna membuat konten:
- Klien mengunggah foto/video.
- Manajemen Konten menyimpan media dan metadata.
- Pembuatan Feed memperbarui feed pengguna dan pengikut terkait.
- Notifikasi memberi tahu pengguna yang tertarik.
Pengguna berinteraksi dengan konten:
- Klien mengirim tindakan like/komentar/share.
- Manajemen Konten dan Graf Sosial memperbarui data terkait.
- Pembuatan Feed mungkin mengatur ulang feed berdasarkan interaksi baru.
- Notifikasi memberi tahu pengguna yang tertarik.
Pengguna menemukan konten baru:
- Klien menggunakan fungsionalitas pencarian.
- Penemuan & Pencarian mengidentifikasi konten yang relevan.
- Klien menampilkan hasil pencarian.
Pengguna mengelola koneksi:
- Klien mengirim permintaan follow/unfollow.
- Graf Sosial memperbarui koneksi.
- Pembuatan Feed menyesuaikan berdasarkan perubahan hubungan.
Pengguna memantau aktivitas:
- Klien memeriksa feed notifikasi.
- Notifikasi memberikan pembaruan tentang peristiwa relevan.
Pertimbangan Desain Kunci:
- Skalabilitas: Sistem harus mampu menangani jutaan pengguna dan volume data yang besar.
- Kinerja: Memberikan waktu respons yang cepat untuk interaksi pengguna dan pengiriman konten.
- Keandalan: Memastikan ketersediaan tinggi dan mencegah kehilangan data.
- Keamanan: Melindungi data dan privasi pengguna.
- Keterlibatan: Merancang fitur yang mendorong interaksi pengguna dan pembuatan konten.
7. Desain API untuk Desain Sistem Instagram
7.1 Mengunggah Foto dan Video
Desain API untuk mengunggah foto dan video ke Instagram:
Endpoints:
- POST /media: Mengirimkan foto atau video baru.
- PUT /media/{media_id}: Memperbarui metadata yang ada untuk item media.
- DELETE /media/{media_id}: Menghapus item media.
Request:
import requests
url = 'https://api.instagram.com/media' # Ganti dengan URL endpoint API yang sebenarnya
access_token = 'your_access_token' # Ganti dengan token akses yang valid
# Definisikan jalur file, caption, hashtag, dan lokasi
file_path = 'path/to/your/photo_or_video.jpg' # Atau .mp4 untuk video
caption = 'Your caption for the media'
hashtags = 'photography,nature,beautiful'
location = {"latitude": 37.421998, "longitude": -122.084269}
# Siapkan header dan file untuk permintaan
headers = {
'Authorization': f'Bearer {access_token}',
'Content-Type': 'multipart/form-data'
}
files = {
'file': open(file_path, 'rb'),
'caption': caption,
'hashtags': hashtags,
'location': str(location) # Lokasi perlu diserialisasi sebagai string
}
# Kirim permintaan POST
response = requests.post(url, headers=headers, files=files)
# Tangani respons
if response.status_code == 201:
data = response.json()
print('Media uploaded successfully!')
print('Media ID:', data['media_id'])
print('URL:', data['url'])
else:
print('Upload failed:', response.text)
print('Error details:', response.json()) # Tampilkan detail kesalahan
Response:
{
"media_id": "1234567890abcdef",
"url": "https://instagram.com/p/12345678",
"created_at": "2024-01-09T18:34:00Z",
"updated_at": "2024-01-09T18:34:00Z"
}
7.2 Mengikuti dan Berhenti Mengikuti Pengguna
Desain API untuk mengikuti dan berhenti mengikuti pengguna di Instagram:
Endpoints:
- POST /users/{user_id}/follow: Mengikuti pengguna yang ditentukan.
- DELETE /users/{user_id}/follow: Berhenti mengikuti pengguna yang ditentukan.
- GET /users/{user_id}/following: Mendapatkan daftar pengguna yang diikuti oleh pengguna yang ditentukan (dengan pagination).
- GET /users/{user_id}/followers: Mendapatkan daftar pengguna yang mengikuti pengguna yang ditentukan (dengan pagination).
Response:
{
"message": "User followed successfully"
}
Request:
import requests
url = f'https://api.instagram.com/users/{user_id_to_follow}/follow'
headers = {'Authorization': f'Bearer {access_token}'}
response = requests.post(url, headers=headers)
if response.status_code == 200:
print('User followed successfully!')
else:
print('Follow failed:', response.text)
print('Error details:', response.json())
7.3 Menyukai atau Tidak Menyukai Postingan
Desain API untuk menyukai dan tidak menyukai postingan:
Endpoints:
- GET /posts/{post_id}: Mendapatkan detail dari postingan, termasuk jumlah like/dislike.
- POST /posts/{post_id}/like: Mendaftarkan like untuk postingan oleh pengguna yang terautentikasi.
- POST /posts/{post_id}/dislike: Mendaftarkan dislike untuk postingan oleh pengguna yang terautentikasi.
- DELETE /posts/{post_id}/like: Menghapus like untuk postingan oleh pengguna yang terautentikasi (jika sebelumnya sudah dilakukan).
- DELETE /posts/{post_id}/dislike: Menghapus dislike untuk postingan oleh pengguna yang terautentikasi (jika sebelumnya sudah dilakukan).
Request:
import requests
url_like = f"https://api.instagram.com/media/likes/{media_id}"
url_unlike = f"https://api.instagram.com/media/likes/{media_id}"
headers = {'Authorization': f'Bearer {access_token}'}
# Like a post
response_like = requests.post(url_like, headers=headers)
# Unlike a post
response_unlike = requests.delete(url_unlike, headers=headers)
Response:
// Request
POST /posts/123/like
Content-Type: application/json
{
"user_id": 456
}
// Response (if successful)
Status: 200 OK
{
"message": "Post liked successfully"
}
// Response (if already liked)
Status: 400 Bad Request
{
"error": "Post already liked"
}
7.4 Mencari Foto dan Video
Search Endpoint: Biasanya permintaan POST ke endpoint /search.
Request:
import requests
url = "https://photoslibrary.googleapis.com/v1/mediaItems:search"
headers = {
"Authorization": "Bearer YOUR_ACCESS_TOKEN" # Ganti dengan token akses Anda
}
data = {
"filters": {
"mediaTypes": ["PHOTO", "VIDEO"] # Cari foto dan video
}
}
response = requests.post(url, headers=headers, json=data)
if response.status_code == 200:
results = response.json()
# Proses hasil pencarian
else:
print("Error:", response.status_code, response.text)
Response:
{
"data": [
{
"media_type": "IMAGE",
"media_url": "https://www.instagram.com/p/abc123/",
"thumbnail_url": "https://scontent-amt2-1.cdninstagram.com/v/t51.2885-15/e35/s1080x1080/275469546_546545454546_54554655465654654.jpg?_nc_ht=scontent-amt2-1.cdninstagram.com&_nc_cat=100&_nc_ohc=xyz123&edm=ABfd0MgBAAAA&ccb=7-4&oh=00_AT854x5465465465454654465546554656546545&oe=62BD5465&_nc_sid=7bff83",
"caption": "My adorable cat!",
"timestamp": "2024-01-10T13:40:00+0000"
},
{
"media_type": "VIDEO",
"media_url": "https://www.instagram.com/tv/xyz987/",
"thumbnail_url": "https://scontent-amt2-1.cdninstagram.com/v/t51.2885-15/e35/s1080x1080/246545465546544546454654465454655465.jpg?_nc_ht=scontent-amt2-1.cdninstagram.com&_nc_cat=101&_nc_ohc=abc123&edm=ABfd0MgBAAAA&ccb=7-4&oh=00_AT854x546546546544654465546554656546554&oe=62BD5465&_nc_sid=7bff83",
"caption": "Amazing sunset timelapse!",
"timestamp": "2024-01-09T20:30:00+0000"
}
]
}
8. Desain Database untuk Instagram
Kita memerlukan tabel-tabel berikut untuk menyimpan data:
8.1 Tabel Pengguna (Users)
Tabel untuk menyimpan data pengguna:
CREATE TABLE Users (
user_id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
profile_picture VARCHAR(255),
bio TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
8.2 Tabel Pengikut (User_Follows)
Tabel untuk menyimpan data pengikut:
CREATE TABLE User_Follows (
follow_id SERIAL PRIMARY KEY,
user_id INT REFERENCES Users(user_id),
follower_user_id INT REFERENCES Users(user_id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
8.3 Tabel Unggahan Pengguna (User_Uploads)
Tabel untuk menyimpan unggahan pengguna:
CREATE TABLE User_Uploads (
upload_id SERIAL PRIMARY KEY,
user_id INT REFERENCES Users(user_id),
media_url VARCHAR(255) NOT NULL,
upload_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
caption TEXT,
location VARCHAR(255)
);
8.4 Tabel Feed Pengguna (User_Feed)
Tabel untuk menyimpan data feed pengguna:
CREATE TABLE User_Feed (
feed_id SERIAL PRIMARY KEY,
user_id INT REFERENCES Users(user_id),
upload_id INT REFERENCES User_Uploads(upload_id),
creation_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
9. Arsitektur Mikroservis untuk Desain Sistem Instagram
Layanan gambar dan pembuatan feed menggunakan arsitektur mikroservis.
Mikroservis: Arsitektur mikroservis adalah gaya arsitektur yang menyusun aplikasi sebagai kumpulan layanan yang:
- Dapat dideploy secara independen.
- Terkopel secara longgar.
- Diatur berdasarkan kapabilitas bisnis.
- Dimiliki oleh tim kecil.
Arsitektur mikroservis memungkinkan organisasi untuk mengirimkan aplikasi besar dan kompleks dengan cepat, sering, andal, dan berkelanjutan – suatu keharusan untuk bersaing dan menang di dunia saat ini.
10. Skalabilitas untuk Desain Sistem Instagram
Skalabilitas mengacu pada kemampuan suatu organisasi (atau sistem, seperti jaringan komputer) untuk berkinerja baik di bawah beban kerja yang meningkat atau berkembang. Sistem yang dapat diskalakan akan mampu mempertahankan atau meningkatkan tingkat kinerja meskipun diuji oleh permintaan operasional yang semakin besar.
Kita dapat menambahkan lebih banyak server ke lapisan layanan aplikasi untuk meningkatkan skalabilitas dan menangani banyak permintaan dari klien. Kita juga dapat meningkatkan jumlah database untuk menyimpan data pengguna yang terus bertambah.
Persyaratan yang telah tercakup:
- Skalabilitas: Kita dapat menambahkan lebih banyak server ke lapisan layanan aplikasi untuk meningkatkan skalabilitas dan menangani banyak permintaan dari klien. Kita juga dapat meningkatkan jumlah database untuk menyimpan data pengguna yang terus bertambah.
- Latensi: Penggunaan cache dan CDN telah mengurangi waktu pengambilan konten.
- Ketersediaan: Kita telah membuat sistem tersedia bagi pengguna dengan menggunakan penyimpanan dan database yang direplikasi di seluruh dunia.
- Durabilitas: Kita memiliki penyimpanan persisten yang memelihara cadangan data sehingga konten yang diunggah (foto dan video) tidak pernah hilang.
- Konsistensi: Kita telah menggunakan penyimpanan seperti blob store dan database untuk menjaga data kita tetap konsisten secara global.
- Keandalan: Database kita menangani replikasi dan redundansi, sehingga sistem kita tetap andal dan data tidak hilang. Lapisan load balancing mengarahkan permintaan ke server yang tidak gagal.
11. Kesimpulan
Dalam artikel ini, kita telah membahas tentang desain sistem Instagram yang mencakup cara menyimpan postingan dan video, menyukai dan tidak menyukai postingan, menampilkan feed, memposting postingan atau video, dan menambahkan hashtag. Desain sistem Instagram adalah arsitektur yang kompleks dan canggih yang memprioritaskan skalabilitas, ketersediaan, keamanan, dan pengalaman pengguna. Kesuksesan platform ini tidak hanya karena antarmuka pengguna yang ramah, tetapi juga infrastruktur backend yang kuat yang mendukung basis pengguna yang besar dan konten dinamis.
Komentar
Posting Komentar