Tugas Pertemuan 13 PPL

Nama : Frederick Yonatan Susanto

NRP : 5025211121

Kelas : PPL A

Tahun Ajaran : 2023/2024 (Genap)


     Pada pertemuan ketigabelas di kelas PPL A, kita diminta untuk membuat rancangan desain Instagram yang meliputi deskripsi aplikasi, spesifikasi kebutuhan / requirements capacity estimation (traffic, storage, dll), high level design, databse design, dll.


1. Deskripsi Aplikasi 


Instagram adalah layanan jejaring sosial berbagi foto dan video Amerika yang dimiliki oleh Meta Platforms. Hal ini memungkinkan pengguna untuk mengunggah media yang dapat diedit dengan filter, diatur berdasarkan hashtag, dan dikaitkan dengan lokasi melalui penandaan geografis. Postingan dapat dibagikan secara publik atau dengan pengikut yang telah disetujui sebelumnya.
      

2. Persyaratan Desain Sistem Instagram

2.1 Persyaratan Fungsional untuk Desain Sistem Instagram

Pada Persyaratan fungsional, kami tidak akan membahas halaman login atau pendaftaran Instagram. Arsitektur Login dan Pendaftaran sama untuk semua orang. Kami akan mencari lebih lanjut seperti memposting foto, dll.

  • Posting foto dan video : Pengguna dapat memposting foto dan video di Instagram.
  • Ikuti 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.
  • Cari foto dan video : Pengguna dapat mencari foto dan video berdasarkan keterangan dan lokasi.
  • Hasilkan umpan berita : Pengguna dapat melihat umpan berita yang terdiri dari foto dan video (dalam urutan kronologis) dari semua pengguna yang mereka ikuti.

2.2 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 apa pun yang diunggah (foto dan video) tidak boleh hilang.
  • Konsistensi : Kita bisa sedikit berkompromi pada konsistensi. Dapat diterima jika konten (foto atau video) memerlukan waktu untuk ditampilkan di feed pengikut yang berada di wilayah yang jauh.
  • Keandalan : Sistem harus mampu mentolerir kegagalan perangkat keras dan perangkat lunak.

3. Estimasi Kapasitas Perancangan Sistem Instagram

Kami memiliki 1 miliar pengguna, dengan 500 juta pengguna aktif harian. Asumsikan 60 juta foto dan 35 juta video dibagikan di Instagram setiap hari. Kami dapat menganggap 3 MB sebagai ukuran maksimum setiap foto dan 150 MB sebagai ukuran maksimum setiap video yang diunggah di Instagram. Rata-rata, setiap pengguna mengirimkan 20 permintaan (jenis apa pun) per hari ke layanan kami.

3.1 Penyimpanan Per Hari

Foto: 60 juta foto/hari * 3 MB = 180 TeraBytes / hari
Video: 35 juta video/hari * 150 MB = 5250 TB / hari
Total ukuran konten = 180 + 5250 = 5430 TB
Total Ruang yang diperlukan untuk Setahun:
5430 TB /hari * 365 (hari dalam setahun) = 1981950 TB = 1981,95 PetaBytes

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
Katakanlah rasio pembaca dan penulis adalah 100:1.
Bandwidth keluar yang diperlukan ~ = 100 * 502,8 Gbps ~= 50,28 Tbps

4. Use Case Diagram untuk Desain Sistem Instagram

uml

Gunakan Diagram Kasus Instagram

Pada Diagram di atas kita telah membahas tentang diagram use case Instagram:

  • 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.

5. Desain Tingkat Rendah (LLD) untuk Desain Sistem Instagram

desain-instagram-lld

Berikut rincian komponen dan interaksi utama untuk desain tingkat rendah Instagram:

  • Layanan Pengguna:
    • Menangani pendaftaran pengguna, login, otentikasi, dan manajemen profil.
    • Menyimpan data pengguna seperti nama pengguna, email, bio, gambar profil, dll.
    • Terintegrasi dengan penyedia otentikasi sosial (misalnya, Facebook, Google).
  • Layanan Pos:
    • Menangani pengunggahan, pengeditan, dan penghapusan foto dan video.
    • Menyimpan metadata postingan seperti keterangan, tagar, lokasi, stempel waktu, dll. Memproses media yang diunggah untuk mengubah ukuran, memfilter, dan membuat thumbnail.
    • Mengelola transcoding foto dan video untuk perangkat dan resolusi berbeda.
  • Layanan Pakan:
    • Menghasilkan umpan berita yang dipersonalisasi untuk setiap pengguna berdasarkan pengikut, suka, aktivitas, dan keterlibatan mereka.
    • Memanfaatkan sistem terdistribusi seperti Apache Kafka atau RabbitMQ untuk pembaruan dan pemberitahuan waktu nyata.
    • Memanfaatkan lapisan cache seperti Redis untuk pengambilan feed cepat dan mengurangi beban database.
  • Layanan Penyimpanan:
    • Menyimpan foto dan video yang diunggah secara efisien dan andal.
    • Memanfaatkan 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:
    • 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:
    • Menangani penambahan, pengeditan, dan penghapusan komentar pada postingan.
    • Melacak rangkaian komentar dan hubungan orang tua-anak.
    • Memberi tahu pengguna tentang komentar baru pada postingan mereka sendiri atau komentar yang mereka ikuti.
  • Layanan Pemberitahuan:
    • Memberi tahu pengguna tentang peristiwa yang relevan seperti suka, komentar, sebutan, dan mengikuti.
    • Mengirimkan notifikasi ke perangkat seluler melalui platform seperti Firebase Cloud Messaging atau Amazon SNS.
    • Memanfaatkan sistem antrian untuk pengiriman notifikasi asinkron.
  • Layanan Analisis:
    • Melacak keterlibatan pengguna, kinerja postingan, dan penggunaan platform secara keseluruhan.
    • Mengumpulkan data tentang tampilan, suka, komentar, berbagi, dan klik.
    • Memberikan wawasan untuk meningkatkan pengalaman pengguna, mengoptimalkan rekomendasi konten, dan menargetkan iklan.

Mengapa kita memerlukan caching untuk menyimpan data?

  • Simpan data dalam cache untuk menangani jutaan pembacaan. Ini meningkatkan pengalaman pengguna dengan mempercepat proses pengambilan. Kami juga akan memilih pemuatan lambat, yang meminimalkan waktu tunggu klien.
  • Ini memungkinkan kami memuat konten saat pengguna menggulir dan karenanya menghemat bandwidth dan fokus memuat konten yang sedang dilihat pengguna. Ini meningkatkan latensi untuk melihat atau mencari foto atau video tertentu di Instagram.

6. Desain Tingkat Tinggi (HLD) untuk Desain Sistem Instagram

Sistem kami harus memungkinkan kami mengunggah, melihat, dan mencari gambar dan video pada tingkat tinggi. Untuk mengunggah gambar dan video, kita perlu menyimpannya, dan saat mengambilnya, kita perlu mengambil data dari penyimpanan. Selain itu, pengguna juga harus diperbolehkan untuk mengikuti satu sama lain.

Pada tingkat tinggi, Instagram dapat dipandang sebagai sebuah sistem dengan komponen dan interaksi utama berikut:

desain-instagram-hld

Komponen:

  • Klien:  Aplikasi seluler, aplikasi web, dan API yang menyediakan antarmuka bagi pengguna untuk berinteraksi dengan sistem.
  • Otentikasi & Otorisasi:  Menangani login pengguna, registrasi, dan kontrol akses.
  • Manajemen Konten:  Mengelola konten buatan pengguna seperti foto, video, streaming langsung, cerita, dan pesan.
  • Pembuatan Umpan:  Mempersonalisasi umpan berita untuk setiap pengguna berdasarkan pengikut, aktivitas, dan keterlibatan mereka.
  • Grafik Sosial:  Melacak hubungan antar pengguna (pengikut, pengikut, teman).
  • Penemuan & Pencarian:  Memungkinkan pencarian pengguna, hashtag, lokasi, dan konten.
  • Notifikasi:  Memberi tahu pengguna tentang peristiwa relevan seperti suka, komentar, sebutan, dan mengikuti.
  • Analisis & 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 Umpan memperbarui umpan pengguna dan pengikut yang relevan.
    • Pemberitahuan menginformasikan pengguna yang tertarik.
  • Interaksi pengguna dengan konten:
    • Klien mengirimkan tindakan suka/komentar/berbagi.
    • Manajemen Konten dan Grafik Sosial memperbarui data yang relevan.
    • Pembuatan Feed berpotensi merombak feed berdasarkan interaksi baru.
    • Pemberitahuan menginformasikan pengguna yang tertarik.
  • Pengguna menemukan konten baru:
    • Klien menggunakan fungsi pencarian.
    • Discovery & Search mengidentifikasi konten yang relevan.
    • Klien menampilkan hasil pencarian.
  • Pengguna mengelola koneksi:
    • Klien mengirimkan permintaan mengikuti/berhenti mengikuti.
    • Grafik Sosial memperbarui koneksi.
    • Pembuatan Umpan menyesuaikan berdasarkan perubahan hubungan.
  • Pengguna memantau aktivitas:
    • Klien memeriksa umpan notifikasi.
    • Pemberitahuan memberikan pembaruan tentang peristiwa yang relevan.

Pertimbangan Desain Utama:

  • Skalabilitas:  Sistem harus menangani jutaan pengguna dan volume data yang sangat besar.
  • Kinerja:  Memberikan waktu respons yang cepat untuk interaksi pengguna dan pengiriman konten.
  • Keandalan:  Pastikan ketersediaan tinggi dan cegah kehilangan data.
  • Keamanan:  Melindungi data dan privasi pengguna.
  • Keterlibatan:  Fitur desain yang mendorong interaksi pengguna dan pembuatan konten.

7. Desain API untuk Desain Sistem Instagram

7.1 Posting foto dan video

Berikut potensi desain API untuk mengunggah foto dan video ke Instagram:

Titik akhir:

  • POST /media:  Mengirimkan foto atau video baru.
  • PUT /media/{media_id}:  Memperbarui metadata yang ada untuk item media.
  • HAPUS /media/{media_id}:  Menghapus item media.

import requests
 
url = 'https://api.instagram.com/media'  # Replace with the actual API endpoint URL
access_token = 'your_access_token'  # Replace with the user's valid access token
 
# Define file path, caption, hashtags, and location (adjust as needed)
file_path = 'path/to/your/photo_or_video.jpg'  # Or .mp4 for videos
caption = 'Your caption for the media'
hashtags = 'photography,nature,beautiful'
location = {"latitude": 37.421998, "longitude": -122.084269}
 
# Prepare headers and files for the request
headers = {
    'Authorization': f'Bearer {access_token}',
    'Content-Type': 'multipart/form-data'
}
files = {
    'file': open(file_path, 'rb'),
    'caption': caption,
    'hashtags': hashtags,
    'location': str(location)  # Location needs to be serialized as a string
}
 
# Send the POST request
response = requests.post(url, headers=headers, files=files)
 
# Handle the response
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())  # Display any error details

7.2 Mengikuti dan berhenti mengikuti pengguna

Berikut desain API potensial untuk mengikuti dan berhenti mengikuti pengguna di Instagram:

Titik akhir:

  • POST /users/{user_id}/follow:  Mengikuti pengguna yang ditentukan.
  • HAPUS /users/{user_id}/follow:  Berhenti mengikuti pengguna tertentu.
  • GET /users/{user_id}/following:  Mengambil daftar pengguna yang diikuti oleh pengguna tertentu (diberi halaman).
  • GET /users/{user_id}/followers:  Mengambil daftar pengguna yang mengikuti pengguna tertentu (diberi halaman).

{
  "message": "User followed successfully"
}

7.3 Suka atau Tidak Suka postingan

Mendesain API untuk menyukai dan tidak menyukai postingan melibatkan banyak pertimbangan. Berikut rincian aspek-aspek utama yang perlu dipikirkan:

Titik Akhir API:

  • GET /posts/{post_id} : Mengambil detail postingan, termasuk jumlah suka/tidak suka.
  • POST /posts/{post_id}/like : Mendaftarkan suka untuk postingan oleh pengguna yang diautentikasi.
  • POST /posts/{post_id}/dislike : Mendaftarkan ketidaksukaan terhadap postingan oleh pengguna yang diautentikasi.
  • DELETE /posts/{post_id}/like : Menghapus suka pada postingan oleh pengguna yang diautentikasi (jika sudah dilakukan sebelumnya).
  • DELETE /posts/{post_id}/dislike : Menghapus ketidaksukaan terhadap postingan oleh pengguna yang diautentikasi (jika sudah dilakukan sebelumnya).

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)

7.4 Cari foto dan video

  • Titik Akhir Pencarian:
    • Biasanya permintaan POST ke  /search titik akhir.
    • Parameter kueri mencakup: query: Istilah penelusuran , media_type: Memfilter hasil berdasarkan foto, video, atau keduanya, Filter tambahan: rentang tanggal, lokasi, orang, dll. (jika didukung)

import requests
 
url = "https://photoslibrary.googleapis.com/v1/mediaItems:search"
headers = {
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"  # Replace with your access token
}
data = {
    "filters": {
        "mediaTypes": ["PHOTO", "VIDEO"]  # Search for both photos and videos
    }
}
response = requests.post(url, headers=headers, json=data)
 
if response.status_code == 200:
    results = response.json()
    # Process the search results
else:
    print("Error:", response.status_code, response.text)

8. Desain Basis Data untuk Desain Basis Data Instagram

Kami membutuhkan tabel berikut untuk menyimpan data kami:

8.1 Pengguna:

Tabel untuk menyimpan data pengguna – Pengguna

{
userId: string[HashKey]
name: string
emailId: string
creationDateInUtc: long
}

8.2 Pengguna_Ikuti:

Tabel untuk menyimpan data pengikut – User_follows

{
followingUserId_followerUserId: string [HashKey]
followingUserId: string [RangeKey]
followerUserId: string
creationDateInUtc: long
}

8.3 Unggahan Pengguna

Tabel untuk menyimpan unggahan pengguna – User_uploads

{
uploadId: string[Hashkey]
userId: string[RangeKey]
imageLocation: string
uploadDateInUtc: long
caption: string
}

8.4 Umpan Pengguna

Tabel untuk menyimpan data feed pengguna – User_feed

{
userId: string[Hashkey]
uploadId: string
creationDateInUtc: long[RangeKey]
}

8.5 Database mana yang harus kita pilih untuk penyimpanan data?

Penting untuk memilih jenis database yang tepat untuk sistem Instagram kita, namun manakah pilihan yang tepat — SQL atau NoSQL? Data kami pada dasarnya bersifat relasional, dan kami memerlukan urutan data (postingan harus muncul dalam urutan kronologis) dan tidak ada data yang hilang bahkan jika terjadi kegagalan (daya tahan data). Selain itu, dalam kasus kami, kami akan mendapatkan keuntungan dari kueri relasional seperti mengambil pengikut atau gambar berdasarkan ID pengguna. Oleh karena itu, database berbasis SQL memenuhi persyaratan ini.


Referensi:




Comments

Popular posts from this blog

Tugas Pertemuan 7 PPL

Quiz 1 PBKK A

Tugas Pertemuan 6 PPL