Wawancara Desain Sistem: Rancang Twitter
"Rancang Twitter" adalah masalah pembuatan feed yang klasik. Tampak sederhana — memposting tweet, membaca timeline — tetapi bagian yang menarik adalah menghasilkan timeline utama setiap pengguna pada skala besar, di mana jawaban yang tepat adalah strategi fan-out hibrida. Pewawancara ingin melihat Anda menemukan bahwa kedua pendekatan naif gagal, dan bernalar sampai pada perpaduannya.
Lakukan secara sengaja: perjelas kebutuhan, perkirakan rasio baca/tulis, rancang penyimpanan tweet, lalu timeline — membandingkan fan-out-on-write dengan fan-out-on-read dan sampai pada hibrida yang menangani masalah selebriti. Panduan di bawah mengikuti jalur tersebut.
1. Memperjelas kebutuhan
Batasi pada masalah inti feed. Pengguna memposting tweet, mengikuti orang lain, dan membaca timeline utama yang menggabungkan tweet dari semua orang yang mereka ikuti, dari yang terbaru.
- Fungsional: memposting tweet, follow/unfollow, timeline utama (orang yang Anda ikuti), timeline pengguna (satu penulis); pencarian dasar di luar ruang lingkup kecuali diminta.
- Non-fungsional: sangat berat pada pembacaan, pembacaan timeline berlatensi rendah, ketersediaan tinggi; konsistensi eventual untuk timeline dapat diterima.
- Perlu diperjelas: media, balasan/thread, dan ranking — akui saja, lalu batasi pada feed kronologis untuk sesi ini.
2. Memperkirakan skala dan rasio baca/tulis
Rasio ini mendorong seluruh desain. Pembacaan jauh lebih banyak daripada penulisan — pengguna menggulir timeline mereka jauh lebih sering daripada memposting. Dengan ratusan juta pengguna, sistem harus membuat pembacaan timeline murah meski itu membuat penulisan lebih mahal. Satu pengamatan ini mengarah pada precompute timeline.
3. Penyimpanan tweet
Tweet sendiri adalah data sederhana yang berat pada append. Simpan dalam penyimpanan yang dipartisi secara horizontal, dengan kunci ID tweet (dengan ID yang dapat diurutkan berdasarkan waktu seperti Snowflake ID, sehingga urutan sudah tertanam). Penyimpanan terpisah untuk graf sosial menyimpan hubungan follower/following.
- Tweet: penyimpanan terdistribusi, dipartisi berdasarkan ID tweet; ID yang dapat diurutkan berdasarkan waktu memberikan urutan kronologis yang murah.
- Graf sosial: siapa mengikuti siapa, dioptimalkan untuk 'dapatkan semua follower X' dan 'dapatkan semua yang diikuti X'.
- Cache (Redis) menyimpan data hot — tweet terbaru dan timeline yang telah dihitung sebelumnya.
4. Pembuatan timeline: fan-out saat tulis vs saat baca
Ini adalah inti dari masalah ini. Fan-out-on-write (push) menyisipkan setiap tweet baru ke daftar timeline yang telah dihitung sebelumnya milik setiap follower pada saat posting — pembacaan timeline menjadi lookup cache yang murah, tetapi posting dari seseorang dengan jutaan follower memicu jutaan penulisan. Fan-out-on-read (pull) membangun timeline pada saat pembacaan dengan menggabungkan tweet terbaru dari semua orang yang Anda ikuti — penulisan murah, tetapi pembacaan mahal dan lambat bagi pengguna yang mengikuti banyak akun.
- Fan-out-on-write: pembacaan cepat, penulisan mahal; sangat baik untuk pengguna normal.
- Fan-out-on-read: penulisan murah, pembacaan mahal; diperlukan untuk akun dengan jumlah follower yang sangat besar.
5. Masalah selebriti dan hibrida
Tidak ada pendekatan murni yang menang, jadi gabungkan keduanya. Gunakan fan-out-on-write untuk sebagian besar pengguna, tetapi untuk akun 'selebriti' dengan jumlah follower yang sangat besar, JANGAN fan-out tweet mereka saat menulis. Sebagai gantinya, pada saat pembacaan, gabungkan timeline follower yang telah dihitung sebelumnya dengan pengambilan langsung dari sedikit selebriti yang mereka ikuti. Ini membatasi amplifikasi penulisan sambil menjaga pembacaan tetap cepat — jawaban yang ingin didengar pewawancara.
6. Trade-off yang perlu diucapkan
Tutup dengan tegangan: amplifikasi penulisan versus latensi pembacaan (seluruh keputusan fan-out), biaya penyimpanan timeline yang telah dihitung sebelumnya versus menghitungnya ulang, dan konsistensi — keterlambatan beberapa detik sebelum tweet muncul di timeline follower dapat diterima, sehingga konsistensi eventual memungkinkan Anda untuk diskalakan. Menyatakan ambang batas hibrida secara eksplisit (bagaimana Anda mengklasifikasikan 'selebriti') menunjukkan penilaian senior.
Latih desain sistem Twitter dengan bantuan real-time
Asisten wawancara desain sistem dari Natively dapat membantu Anda tetap terstruktur selama sesi live — menyarankan dimensi berikutnya yang perlu dibahas dan menampilkan trade-off secara real-time, semuanya di perangkat Anda sendiri.
