Design Tinder
Swipe, match, and recommend at scale, with geospatial sharding and the double-opt-in 'it's a match' problem.
Prompt latihan
Problem Statement, Functional Requirements, and Scale Assumptions
Tentukan ruang lingkup sistem aplikasi kencan: pembuatan profil pengguna, tumpukan kartu (card stack) profil terdekat yang dapat di-swipe, pencatatan aksi swipe (like atau pass), deteksi match mutual dan notifikasi, serta chat teks dasar antar match. Kecualikan secara eksplisit panggilan video, fitur pembayaran dan premium, analisis social graph, dan antarmuka web dari desain awal. Nyatakan asumsi skala awal (pengguna aktif per region, swipe per sesi, laju match) sebelum mengusulkan komponen apa pun.
Non-Functional Requirements
Tentukan NFR utama: latensi pemuatan card stack (target <200ms untuk batch berikutnya), kesegaran lokasi untuk pencocokan proximity (seberapa basi indeks geospasial boleh sebelum match menurun), kecepatan pengiriman notifikasi match (near-real-time, match mutual harus memberi notifikasi dalam hitungan detik), dan performa pengiriman gambar profil (waktu muat yang dirasakan untuk foto kartu). Bedakan antara kebutuhan real-time (pemuatan kartu, notifikasi match) dan kebutuhan eventually-consistent (update indeks, propagasi edit profil).
Quantitative Analysis
Estimasikan QPS swipe puncak (pengguna aktif per region × swipe per menit di jam puncak), storage profil (ukuran profil teks + jumlah foto per pengguna × total pengguna), volume query geospasial (request card stack × query proximity per request), dan volume notifikasi match (QPS swipe × laju match). Turunkan storage untuk tabel record swipe (dibutuhkan untuk deteksi match mutual dan deduplikasi 'sudah dilihat') dan estimasikan laju pertumbuhannya.
API Design
Tentukan operasi API untuk mengambil batch card stack berikutnya (termasuk cursor paginasi), mencatat swipe (like atau pass dengan ID profil), mengambil daftar match, memperbarui profil pengguna, memperbarui lokasi pengguna, dan mengirim pesan chat. Sertakan bentuk request dan response, kasus error (card stack kosong, profil yang sudah di-swipe, lokasi kedaluwarsa), dan kebutuhan idempotensi untuk pencatatan swipe.
High-Level Design
Usulkan komponen utama: profile service (CRUD profil, unggah foto ke object storage via CDN), matching engine (query geospasial untuk profil terdekat, filter sudah-dilihat, filter preferensi), indeks geospasial (Redis GEO atau store berbasis Quadtree untuk lokasi pengguna langsung), swipe service (mencatat like/pass, memicu deteksi match mutual), notification service (push notification saat match mutual), dan chat service (store pesan + pengiriman). Telusuri alur dari pengguna yang swipe kanan melalui deteksi match dan notifikasi.
Additional High-Level Design Prompts
Bahas tiga area desain lanjutan: (1) Verifikasi profil, bagaimana verifikasi foto (pengguna mengambil selfie yang cocok dengan sebuah pose, dibandingkan dengan foto profil) diimplementasikan tanpa memerlukan verifikasi sinkron sebelum profil tayang; (2) Pelaporan dan pemblokiran, bagaimana daftar blokir pengguna memengaruhi pembuatan card stack (pengguna yang diblokir tidak boleh pernah muncul, bahkan jika mereka memperbarui profilnya) dan bagaimana laporan memicu alur peninjauan manusia tanpa mengekspos identitas pelapor; (3) Preferensi discovery, bagaimana rentang usia, jarak maksimum, dan filter gender diterapkan secara efisien pada level query geospasial versus post-filter di memori, dan apa trade-off UI-nya untuk filter yang sangat ketat (card stack kosong).
Deep Dives
Deep dive ke tiga area: (1) Algoritma pencocokan, rancang model scoring yang menggabungkan proximity geospasial (lebih dekat = skor dasar lebih tinggi), sinyal minat mutual (probabilitas like dua arah dari perilaku masa lalu), keterkinian aktivitas (menghukum profil tidak aktif), dan kesegaran rekomendasi (memastikan profil yang sama tidak muncul berulang); bahas cold start untuk pengguna baru (fallback ke ranking popularitas dalam sel-nya); bandingkan pra-komputasi batch vs. scoring per-request real-time; (2) Privasi lokasi, analisis trade-off presisi geohash (presisi 6 ≈ 1,2km mengungkap lokasi presisi; presisi 4 ≈ 40km terlalu kasar untuk pencocokan kota); rancang obfuskasi lokasi (tambahkan noise acak dalam radius sel) sambil mempertahankan akurasi pencocokan; bahas berbagi lokasi berbasis-consent (update latar belakang hanya saat aplikasi aktif); analisis frekuensi update lokasi latar belakang vs. latar depan dan implikasi baterai; (3) Preloading kartu profil, rancang strategi prefetch (saat pengguna men-swipe kartu 1-3, prefetch kartu 4-10 di latar belakang); optimalkan pengiriman gambar (gambar responsif via CDN, WebP/AVIF, beberapa resolusi per foto); rancang cache card stack ramah-offline (simpan 20 kartu berikutnya secara lokal untuk ketahanan subway/terowongan); bahas pemuatan gambar progresif (blur-up resolusi-rendah saat resolusi penuh dimuat).
Final Review Handoff Readiness
Ringkas keputusan desain end-to-end: pilihan indeks geospasial, komponen model scoring, strategi presisi lokasi (level geohash dan obfuskasi), strategi preload kartu, optimasi pengiriman gambar, dan pipeline notifikasi match. Soroti dua pertanyaan terbuka terbesar yang tersisa (laju pertumbuhan storage record swipe pada skala besar, dan perbedaan kepatuhan regulasi privasi lokasi per region) dan berikan rencana rollout: luncurkan dengan pencocokan proximity dasar dulu, tambahkan peningkatan model scoring, lalu tambahkan ranking terpersonalisasi secara bertahap.
Preview solusi
Merancang Tinder (Dating App), Solusi Referensi 1. Scope dan Non-Goals Dalam scope: Pembuatan profil pengguna dengan upload foto, sebuah card stack yang bisa di-swipe berisi profil terdekat yang difilter berdasarkan preferensi discovery, pencatatan aksi swipe (like/pass), deteksi mutual match, push notification saat match, dan chat teks dasar antar match. No…