Perintah dan Konteks yang Berlaku
Desain personalized news feed yang didukung oleh follow graph. Pengguna dapat memublikasikan postingan teks atau gambar, mengikuti atau berhenti mengikuti penulis, dan menelusuri home feed yang diperingkat berdasarkan relevansi. Menghapus postingan, menjadikannya privat, memblokir penulis, atau berhenti mengikuti harus segera memengaruhi pembacaan berikutnya. Suka (likes), komentar, dan model rekomendasi adalah sinyal pemeringkatan. Transcoding media, pohon komentar (comment trees), lelang iklan (ad auctions), dan pelatihan model berada di luar cakupan.
Asumsikan 50 juta pengguna aktif harian (DAU). Setiap pengguna aktif membaca 20 halaman per hari, dengan 20 item per halaman, dan sistem menerima 10 juta postingan baru per hari. Feed-read p99 harus di bawah 200 milidetik. Postingan penulis normal harus dapat dilihat oleh pengikut aktif dalam waktu lima detik pada p99. Penulis normal memiliki rata-rata 200 pengikut yang memenuhi syarat, sedangkan penulis terbesar memiliki 50 juta pengikut. Angka-angka dan batas waktu ini adalah batasan wawancara, bukan klaim tentang produk yang sudah ada.
Perintah ini cocok untuk wawancara backend, infrastruktur, dan desain sistem tingkat menengah hingga senior. Materi wawancara publik bertanya langsung tentang write fan-out, read fan-out, penulis selebritas, cursor pagination, caching, dan konsistensi. Laporan rekayasa pihak pertama juga memisahkan pengambilan kandidat (candidate retrieval), agregasi, pemfilteran, dan pemeringkatan multi-pass sambil mempertahankan konten yang dimaterialisasi untuk graceful degradation. Oleh karena itu, jawaban yang kuat menggabungkan mekanisme dari persyaratan biaya dan kebenaran eksplisit alih-alih mereproduksi satu diagram tetap.
Apa yang Dievaluasi oleh Pewawancara
Pertama, dapatkah kandidat mengukur asimetri baca-tulis? Lima puluh juta DAU dikali 20 halaman adalah satu miliar pembacaan per hari, atau sekitar 11.600 rata-rata QPS. Puncak lima kali lipat adalah sekitar 58.000 QPS. Sepuluh juta postingan rata-rata hanya sekitar 116 pembuatan per detik, tetapi write fan-out ke 200 pengikut yang memenuhi syarat memperluasnya menjadi sekitar dua miliar penyisipan referensi timeline per hari, atau sekitar 23.100 per detik rata-rata. Membandingkan hanya QPS postingan mentah menyembunyikan beban tulis utama.
Kedua, apakah kandidat memahami batasan push, pull, dan hybrid? Fan-out-on-write murni membuat pembacaan menjadi murah, tetapi satu penulis dengan 50 juta pengikut menciptakan 50 juta penyisipan. Fan-out-on-read murni membuat penerbitan menjadi murah, tetapi setiap pembacaan dapat menggabungkan banyak penulis yang diikuti. Desain yang kuat menghitung referensi terlebih dahulu (precomputes) untuk penulis normal, menarik penulis high-fan-out selama pembacaan, dan menetapkan batasannya dari pengikut aktif, tingkat postingan, anggaran antrean (queue budget), dan target kesegaran (freshness goals).
Ketiga, dapatkah kandidat memisahkan source of truth postingan, kumpulan kandidat, dan presentasi akhir? Sebuah timeline menyimpan referensi ringan daripada salinan konten lengkap. Agregator menggabungkan inbox yang telah dihitung sebelumnya, postingan terbaru dari penulis high-fan-out, dan kandidat rekomendasi; menerapkan otorisasi, penghapusan, pemblokiran, dan deduplikasi; lalu memeringkat dan menghidrasi. Skor model tidak pernah menimpa aturan visibilitas.
Keempat, dapatkah kandidat mempertahankan semantik paginasi yang berguna saat pemeringkatan berubah? Skor bergerak seiring interaksi dan versi model, sehingga offset atau skor saja menyebabkan duplikat dan kelalaian (omissions). Jawaban harus mengusulkan salah satu antara sesi feed beku berumur pendek (short-lived frozen feed session) atau kursor majemuk berversi (versioned compound cursor) dan menjelaskan apa yang terjadi ketika postingan baru, penghapusan, unfollow, dan perubahan visibilitas terjadi selama scrolling.
Terakhir, desain harus dapat pulih dan dapat diuji kesalahannya (falsifiable). Event bus, cache, dan fan-out worker dapat gagal atau mengulangi pekerjaan. Referensi idempoten, pemantauan kelambatan (lag monitoring), fallback sumber terbatas (bounded source fallback), pemfilteran tombstone, dan pemindaian perbaikan harus konvergen. Validasi harus mencakup lonjakan selebritas (celebrity bursts), event duplikat dan di luar urutan (out-of-order), race condition pada unfollow, kebocoran penghapusan, dan kehilangan cache.
Pertanyaan untuk Diklarifikasi Sebelum Menjawab
- Apa yang mengisi halaman beranda? Terutama postingan dari penulis yang diikuti, dengan kumpulan rekomendasi kecil. Iklan, grup,
dan feed topik berada di luar cakupan.
- Apa kontrak pemeringkatannya? Pemeringkatan relevansi adalah default. Hasil harus segar dan mencampur sumber
secara sengaja, tetapi urutan kronologis yang ketat tidak diperlukan.
- Siapa yang boleh melihat postingan? Postingan dapat bersifat publik, hanya pengikut, atau privat. Pemblokiran, penghapusan, dan pembatasan visibilitas
lebih diutamakan daripada cache hit dan pemeringkatan.
- Siapa yang membutuhkan read-your-writes? Penulis harus segera melihat postingan baru. Pengikut normal yang aktif memiliki target
visibilitas lima detik. Pengikut offline dapat diperbarui pada kunjungan berikutnya.
- Seberapa stabil paginasi harus berjalan? Satu scroll terus-menerus harus meminimalkan duplikat dan celah. Postingan baru dapat muncul saat
refresh atau dalam sesi baru. Penghapusan dan pencabutan akses segera berlaku dalam sesi saat ini.
- Seberapa miring (skewed) grafiknya? Penulis normal memiliki rata-rata 200 pengikut yang memenuhi syarat, sedangkan yang terbesar dapat memiliki 50 juta.
Rata-rata tidak boleh menyembunyikan hotspot.
- Berapa banyak yang disimpan? Hitung sebelumnya 500 referensi kandidat terbaru untuk setiap pengguna aktif. Simpan badan postingan di bawah
kebijakan produk dan ambil item yang lebih lama dari indeks penulis dan rekomendasi jika diperlukan.
- Apa persyaratan regionalnya? Layani pembacaan secara lokal dan replikasikan postingan secara asinkron setelah dikomit di
wilayah asal penulis. Kesegaran biasa bisa dalam hitungan detik; pembatasan visibilitas menggunakan jalur pembatalan (invalidation path) berprioritas lebih tinggi.
Kerangka Jawaban 30 Detik
“Saya akan memisahkan penyimpanan postingan otoritatif, follow graph, dan inbox kandidat per pengguna. Transaksi pembuatan menulis postingan dan event outbox. Fan-out worker secara idempoten memasukkan penulis normal ke dalam inbox pengikut aktif, sementara penulis high-fan-out hanya menulis indeks recent-author dan ditarik (pull) selama pembacaan. Feed aggregator menggabungkan kandidat yang telah dihitung sebelumnya, high-fan-out, dan rekomendasi; menerapkan otorisasi, penghapusan, pemblokiran, dan deduplikasi; kemudian menggunakan pengambilan dan pemeringkatan untuk membuat sesi feed berumur pendek. Kursor berisi sesi dan posisi, dan badan postingan dihidrasi hanya untuk item akhir. Penghapusan dan pembatasan visibilitas menulis tombstone otoritatif dan pembatalan prioritas tinggi, sementara setiap pembacaan memeriksa ulang kembali. Selama antrean mengalami lag, kembalikan feed terwujud yang lebih lama dan lakukan pembacaan sumber terbatas. Pantau latensi post-to-visible, duplikat, kebocoran penghapusan, dan p99 setiap tahap.”
Penjelasan Mendalam Langkah demi Langkah
Langkah 1: Turunkan anggaran arsitektur dari kapasitas
Pembacaan feed harian adalah:
50,000,000 DAU × 20 pages/day = 1,000,000,000 feed reads/day
1,000,000,000 / 86,400 ≈ 11,574 average read QPS
11,574 × 5 peak factor ≈ 57,870 peak read QPSRata-rata pembuatan postingan 10,000,000 / 86,400 ≈ 116 QPS. Jika penulis normal melakukan fan-out ke rata-rata 200 pengikut aktif, mereka menghasilkan sekitar dua miliar penyisipan referensi kandidat per hari, atau rata-rata 2,000,000,000 / 86,400 ≈ 23,148 penyisipan per detik. Satu postingan dengan 50 juta pengikut melebihi anggaran tulis normal selama beberapa detik, jadi fan-out penuh sinkron tidak aman.
Menyimpan 500 referensi untuk masing-masing dari 50 juta pengguna aktif menghasilkan 25 miliar referensi. Jika referensi kasar menggunakan 64 byte untuk post_id, author_id, skor awal, waktu, dan flag, batas bawah logis adalah sekitar 1,6 TB sebelum indeks, overhead mesin, dan replika. Oleh karena itu, timeline harus menyimpan referensi terbatas, bukan salinan badan postingan, dan menggunakan penyimpanan berjenjang aktivitas (activity-tiered storage).
Langkah 2: Tentukan kepemilikan, API, dan model data minimum
Layanan postingan memiliki body, author, creation time, visibility, version, dan deletion tombstone. Layanan social-graph memiliki indeks kedekatan (adjacency indexes) following dan followers. Layanan feed memiliki referensi kandidat, sesi, dan catatan impresi. Penyimpanan objek dan CDN menampung gambar; timeline hanya berisi referensi media. API inti dapat berupa:
POST /v1/posts create a post with Idempotency-Key
DELETE /v1/posts/{post_id} write a deletion tombstone
PUT /v1/users/{id}/following/{author} follow an author
DELETE /v1/users/{id}/following/{author} unfollow an author
GET /v1/feed?cursor=...&limit=20 read one ranked page
GET /v1/posts/{post_id} hydrate one visible postposts menyimpan status otoritatif berdasarkan post_id dan indeks terbaru pada (author_id, created_at, post_id). follows harus mencantumkan followee berdasarkan viewer dan melakukan shard followers berdasarkan author. feed_inbox dipartisi oleh viewer_id; sort key-nya mencakup skor pengambilan, waktu pembuatan, dan post_id. feed_sessions menyimpan sementara versi pemeringkatan, ID kandidat yang diurutkan, dan masa kedaluwarsa. Event impresi dan interaksi masuk ke log terpisah untuk fitur dan eksperimen daripada memperbarui setiap kandidat secara sinkron selama pembacaan.
Pembuatan postingan menggunakan kunci idempoten dari pemanggil (caller idempotency key). Postingan dan event outbox dikomit dalam satu transaksi database, setelah itu penulis dapat membaca dari source of truth postingan. Bus menyediakan pengiriman setidaknya sekali (at-least-once delivery). Penulisan (viewer_id, post_id) yang unik atau kondisional mengonvergensikan fan-out duplikat. Event membawa versi postingan sehingga event lama tidak dapat membangkitkan kembali postingan yang dihapus atau baru saja dibatasi.
Langkah 3: Gunakan hybrid fan-out untuk penulis normal dan high-fan-out
Setelah penulis normal memposting, layanan fan-out membaca shard dari pengikut aktif yang memenuhi syarat dan menyisipkan batch referensi ringan ke setiap inbox. Pekerja (workers) melacak kemajuan dengan kursor shard dan ID event. Batch yang mengalami batas waktu (timed-out) mengulang pekerjaan yang sama tanpa membuat kandidat kedua. Pengguna offline atau tidak aktif lama tidak perlu segera dimaterialisasi; kandidat terbaru mereka dapat dibangun kembali dari follow graph pada kunjungan berikutnya.
Postingan high-fan-out hanya masuk ke indeks terbaru (author_id, created_at) dan hot cache. Saat viewer mengikuti penulis tersebut, agregator menarik sejumlah item terbaru yang terbatas dari masing-masing penulis secara paralel dan menggabungkannya dengan inbox. Batas tersebut tidak boleh berupa satu konstanta jumlah pengikut yang permanen. Perkirakan biaya penulisan eligible_active_followers × posts_per_window dan bandingkan dengan perkiraan biaya read-merge, ruang kepala antrean (queue headroom), dan anggaran kesegaran lima detik. Jika seorang penulis menjadi populer atau memposting secara serentak (burst), control plane dapat mengalihkan penulis ke mode pull. Batch yang sudah diantrekan dapat selesai secara idempoten atau dibatalkan, tetapi kedua jalur tidak boleh berjalan tanpa batas.
Pull masih dapat menciptakan read fan-out yang mahal saat viewer mengikuti banyak penulis high-fan-out. Agregator membatasi kandidat, konkurensi, dan batas waktu per sumber; meng-cache indeks penulis terbaru; dan mengembalikan kandidat lain yang memenuhi syarat ketika satu sumber mengalami timeout. Pra-agregasi regional atau kluster-follow dimungkinkan, tetapi itu hanya dibenarkan setelah biaya penggabungan yang terukur menjadi bottleneck.
Langkah 4: Pisahkan pembuatan kandidat, pemfilteran, pemeringkatan, dan hidrasi
Jalur baca memiliki empat tahap:
- Baca batch kandidat dari inbox penulis normal dan batch terbatas dari sumber high-fan-out serta rekomendasi.
- Deduplikasi berdasarkan
post_id, lalu periksa follow, block, tombstone, visibilitas saat ini, dan kebijakan regional. - Gunakan skor murah untuk mengurangi set, lalu model yang lebih berat untuk kemungkinan interaksi, kesegaran, kualitas sumber, dan
umpan balik negatif, diikuti oleh batasan keragaman dan frekuensi.
- Lakukan batch-hydrate pada body, ringkasan penulis, dan hitungan agregat untuk 20 item terakhir, kembalikan, dan catat impresi
secara asinkron.
Laporan rekayasa yang dipublikasikan Meta menjelaskan agregator feed yang mengumpulkan kandidat, objek, dan fitur sebelum pemeringkatan, dengan beberapa lintasan model yang mengurangi komputasi. Arsitektur yang dipublikasikan Pinterest juga memisahkan kumpulan kandidat yang belum dilihat, pembuatan konten, dan feed yang dimaterialisasi. Desain wawancara tidak perlu menyalin salah satu dari kedua sistem tersebut, tetapi laporan-laporan ini menunjukkan mengapa menyalin postingan lengkap ke dalam cache dan mengurutkannya di sana tidak memiliki batasan penting.
Otorisasi dan batasan produk berlaku sebelum dan sesudah pemeringkatan. Pemfilteran awal menghemat pekerjaan; memeriksa ulang versi postingan selama hidrasi memblokir penghapusan atau pembatasan visibilitas yang tiba selama pemeringkatan. Skor model hanyalah input pengurutan dan tidak dapat menampilkan kembali konten yang tidak terlihat. Hitungan interaksi bisa konsisten pada akhirnya (eventually consistent). Penulis, body, visibilitas, dan tombstone berasal dari versi postingan otoritatif.
Langkah 5: Stabilkan pemeringkatan dinamis dengan sesi feed
offset mengulang atau melompati item saat konten baru tiba atau skor berubah. Keyset (score, post_id) saja juga tidak cukup ketika pemeringkatan ulang mengubah skor sebelum halaman berikutnya. Permintaan pertama dapat memeringkat hingga 500 ID kandidat dan menyimpannya di bawah feed_session_id selama 30 menit. Kursor buram (opaque cursor) berisi sesi, posisi berikutnya, sidik jari kueri, dan tanda tangan. Halaman berikutnya membaca berdasarkan posisi, memeriksa ulang visibilitas, dan mengisi celah.
Postingan baru muncul saat penonton me-refresh atau memulai sesi baru alih-alih disisipkan di tengah. Penghapusan, pemblokiran, dan pembatasan visibilitas difilter secara instan, sehingga sesi saat ini dapat kehilangan item; agregator mengisinya dari kandidat sesi berikutnya. Jika cache sesi hilang atau kedaluwarsa, kembalikan hasil cursor-expired yang dapat dikenali sehingga klien dapat mempertahankan ID yang sudah ditampilkan dan me-refresh. Jangan diam-diam menerapkan posisi lama ke pemeringkatan baru.
Jika menyimpan 500 ID beku terlalu mahal, simpan epoch pemeringkatan dan keyset majemuk dan biarkan klien mengirimkan ringkasan dari ID yang ditampilkan. Desain tersebut menggunakan lebih sedikit penyimpanan sesi tetapi membuat deduplikasi, perubahan model, dan pengisian penghapusan menjadi lebih sulit. Pilihlah berdasarkan durasi scroll terus-menerus, tingkat duplikat yang dapat diterima, dan anggaran sesi alih-alih memperlakukan pengodean kursor sebagai jawaban utama.
Langkah 6: Konvergensikan follow, penghapusan, dan perubahan visibilitas dengan benar
Setelah follow dikomit, pembacaan penonton berikutnya dapat menarik postingan terbaru penulis baru sementara backfill terbatas berjalan secara asinkron. Unfollow dan block pertama-tama memperbarui grafik otoritatif; jalur baca segera memfilter penulis tersebut, kemudian membersihkan inbox secara asinkron. Jutaan penghapusan fisik tidak harus selesai sebelum presentasi berhenti. Jika event follow dan post tiba tidak berurutan, versi hubungan dalam kandidat hanyalah sebuah pengoptimalan. Visibilitas akhir tetap menggunakan aturan otoritatif saat ini.
Saat menghapus postingan atau menjadikannya privat, layanan postingan mengomit versi baru, tombstone, dan event outbox berprioritas tinggi secara bersamaan. Pembatalan cache, pembersihan pencarian, dan pembersihan inbox dapat dilakukan secara asinkron, tetapi hidrasi feed melakukan batch-read pada versi saat ini dan memfilternya. Cache tombstone aktif mempersingkat pemeriksaan, sementara catatan postingan yang tahan lama mencegah konten usang muncul kembali setelah cache hilang. Pemindaian perbaikan menghapus referensi lama; pembersihan fisik bukanlah otorisasi.
Suka dan komentar tidak boleh menulis ulang setiap inbox pengikut setiap kali skor berubah. Event interaksi memperbarui hitungan agregat dan fitur, dan penonton aktif memeringkat ulang kandidat pada permintaan berikutnya. Konten yang sangat populer dapat memperbarui cache fitur bersama. Ini menerima keusangan pemeringkatan sementara dan menghindari pengubahan setiap interaksi menjadi global fan-out lainnya.
Langkah 7: Rancang degradasi, pemulihan, dan batas regional
Selama lag antrean fan-out, lindungi pembuatan postingan dan pembacaan feed yang dimaterialisasi terlebih dahulu. Feed dapat mengembalikan kandidat lama yang memenuhi syarat dan melakukan pembacaan sumber terbatas untuk orang-orang yang baru saja aktif diikuti penonton. Kesegaran dapat menurun; otorisasi tidak boleh. Jika satu penulis menciptakan hotspot antrean, alihkan penulis tersebut ke mode pull dan batasi batch yang belum selesai. Setelah pemulihan, kejar ketertinggalan secara idempoten berdasarkan waktu event dan versi. Pantau usia event tertua, bukan hanya panjang antrean.
Jika cache kandidat gagal, baca lebih sedikit kandidat dari inbox persisten atau kembalikan sesi yang disimpan. Jika pemeringkatan mengalami timeout, gunakan skor kesegaran deterministik ditambah aturan keragaman. Ketika penyimpanan postingan atau grafik otoritatif tidak tersedia, sajikan hanya konten yang diverifikasi sebelumnya dalam TTL otorisasi yang aman. Setelah TTL tersebut, gagalkan atau persempit hasil daripada menampilkan konten yang aksesnya mungkin telah dicabut.
Di banyak wilayah, wilayah asal penulis menerima postingan dan menetapkan ID global, kemudian event direplikasi ke wilayah baca secara asinkron. Konten biasa mungkin memiliki kesegaran tingkat detik; penulis mendapatkan read-your-writes langsung melalui wilayah asal. Penghapusan, pemblokiran, dan pembatasan visibilitas menggunakan replikasi berprioritas lebih tinggi, dan replika lama dibatasi sampai layanan tombstone global mengonfirmasi statusnya. Penulisan active-active pada follow-graph menambah konflik hubungan dan sebaiknya hanya diperkenalkan untuk persyaratan eksplisit.
Langkah 8: Buktikan batasan dengan metrik dan injeksi kesalahan (fault injection)
Metrik inti mencakup keberhasilan pembuatan, visibilitas post-to-first dan post-to-95-percent-active-follower, throughput fan-out per-shard dan lag tertua, latensi penarikan high-fan-out, jumlah kandidat, tingkat deduplikasi, tingkat pemfilteran, p99 pengambilan dan pemeringkatan, ukuran batch hidrasi, hit rate cache, kedaluwarsa kursor, duplikat halaman, halaman kosong, dan kebocoran konten yang dihapus atau dicabut. Metrik terakhir harus tetap nol dan membutuhkan uji sintetik aktif (synthetic probes).
Injeksi kesalahan harus mencakup event postingan duplikat dan di luar urutan; postingan berulang oleh penulis dengan 50 juta pengikut; penulis yang beralih dari push ke pull di tengah-tengah fan-out; follow, unfollow, dan postingan yang bersamaan; penghapusan atau perubahan privasi saat membuka halaman; cache tombstone yang hilang; satu shard pengikut yang lambat; pemadaman dan pengejaran event-bus; timeout pemeringkatan; node sesi feed yang hilang; dan penundaan replikasi regional. Setiap skenario memastikan bahwa tidak ada konten tidak sah yang muncul, referensi konvergen, penurunan latensi dapat diamati, dan pemulihan tidak memperbanyak penulisan duplikat.
Contoh Jawaban Berkualitas Tinggi
“Dengan 50 juta DAU dan 20 halaman setiap hari, saya mendapatkan sekitar 11.600 rata-rata pembacaan feed per detik dan 58.000 pada puncak lima kali lipat. Sepuluh juta postingan harian hanya sekitar 116 QPS, tetapi 200 pengikut aktif per penulis normal memperluasnya menjadi sekitar 23.100 penyisipan kandidat per detik rata-rata. Satu postingan ke 50 juta pengikut tidak dapat menggunakan push penuh sinkron.
Saya akan memisahkan source of truth postingan, grafik sosial, dan inbox kandidat. Transaksi pembuatan menulis postingan dan outbox. Event penulis normal di-fan out berdasarkan shard pengikut ke dalam inbox per pengguna dengan idempotensi viewer_id + post_id. Penulis high-fan-out hanya menulis indeks recent-author serta ditarik dan digabungkan selama pembacaan feed. Batas push-pull menggunakan pengikut aktif, tingkat postingan, anggaran antrean, dan biaya pembacaan. Timeline menyimpan referensi; body dan media hanya dihidrasi secara batch untuk item akhir.
Untuk pembacaan, agregator memperoleh kandidat terbatas dari inbox, high-fan-out, dan sumber rekomendasi. Ini memfilter dan mendeduplikasi berdasarkan follow, block, tombstone, dan visibilitas saat ini sebelum pengambilan murah, pemeringkatan lebih berat, keragaman, dan kontrol frekuensi. Halaman pertama membekukan hingga 500 kandidat dalam sesi feed 30 menit, dan kursor berisi sesi ditambah posisi. Postingan baru menunggu refresh, sementara penghapusan dan pembatasan visibilitas difilter dan diisi ulang pada setiap halaman.
Perubahan penghapusan dan privasi mengomit versi otoritatif ditambah pembatalan berprioritas tinggi. Pembersihan cache dan inbox mungkin mengalami lag, tetapi setiap presentasi memeriksa ulang statusnya. Selama antrean mengalami lag, kembalikan feed terwujud yang lebih lama dan lakukan pembacaan sumber terbatas; selama pemeringkatan timeout, beralihlah ke kesegaran. Otorisasi tidak pernah diturunkan mutunya. Saya akan memantau latensi post-to-visible, lag tertua, p99 setiap tahap pemeringkatan, tingkat duplikat, dan kebocoran konten yang dicabut, lalu menyuntikkan lonjakan selebritas, event duplikat, race condition pada unfollow, penghapusan, kehilangan cache, dan kesalahan regional.”
Kesalahan Umum
- Hanya membandingkan QPS baca dan tulis mentah. Memposting rata-rata sekitar 116 QPS, tetapi fan-out pengikut mendominasi penulisan.
Hitung amplifikasi dan grafik heavy-tailed.
- Menggunakan fan-out-on-write untuk setiap penulis. Penulis dengan 50 juta pengikut menyebabkan 50 juta penyisipan. Tarik penulis
high-fan-out selama pembacaan.
- Menjadikan ambang batas selebritas sebagai konstanta permanen. Aktivitas pengikut, tingkat postingan, dan ruang kepala antrean dapat berubah.
Klasifikasikan dari biaya dan SLO serta lindungi transisinya.
- Menyalin seluruh badan konten ke dalam timeline. Pengeditan, penghapusan, dan perubahan visibilitas menciptakan bidang pembatalan yang sangat besar.
Simpan referensi dan periksa ulang versi selama hidrasi.
- Menggunakan
offsetuntuk halaman yang diperingkat secara dinamis. Penyisipan dan pemeringkatan ulang menyebabkan duplikat dan celah. Gunakan sesi
feed berumur pendek atau kursor majemuk berversi.
- Memfilter unfollow dan penghapusan hanya dalam tugas latar belakang (background jobs). Kelambatan pembersihan membocorkan konten. Periksa grafik
otoritatif, tombstone, dan visibilitas selama pembacaan.
- Mengklaim exactly-once end-to-end dari event bus. Pekerja, penyimpanan, dan percobaan ulang tetap menduplikat. Konvergensikan dengan
ID event, versi postingan, dan unique candidate key.
- Melewatkan otorisasi selama degradasi. Pengurutan yang usang dan kandidat yang lebih sedikit mungkin dapat diterima; tampilan tanpa izin
tidak dapat diterima. Berikan pemfilteran keamanan anggarannya sendiri dan kebijakan kegagalan.
- Hanya menguji lalu lintas normal. Risiko penting adalah penulis high-fan-out, lag, perubahan urutan, dan race condition pada otorisasi.
Injeksi kesalahan harus mencakup batas-batas tersebut.
Pertanyaan Lanjutan dan Tanggapan
Lanjutan 1: Bagaimana kedua jalur menghindari duplikat ketika penulis normal tiba-tiba memperoleh 50 juta pengikut?
Control plane mengalihkan penulis ke mode pull di bawah suatu versi. Tugas fan-out membaca versi mode tersebut dan hanya mengizinkan sejumlah batch terbatas yang telah diklaim untuk diselesaikan. Kandidat bersifat idempoten pada (viewer_id, post_id), sehingga salinan yang di-push dan di-pull bergabung menjadi satu. Antrean memberi setiap penulis kuota, dan postingan baru selama transisi langsung menuju ke indeks high-fan-out.
Lanjutan 2: Apa yang terjadi pada sesi feed lama setelah penonton berhenti mengikuti (unfollow) seorang penulis?
Sesi membekukan pengurutan, bukan otorisasi. Setiap batch hidrasi halaman memeriksa follow dan block graph saat ini. Konten yang di-unfollow difilter dan digantikan dari kandidat sesi selanjutnya. Pembersihan inbox secara asinkron menghemat ruang tetapi tidak memberikan semantik otorisasi instan.
Lanjutan 3: Bagaimana Anda mendukung urutan kronologis yang ketat?
Gunakan kembali sumber kandidat dan filter visibilitas, ubah sort key menjadi (created_at, post_id), dan gunakan keyset pagination dengan batas atas waktu snapshot. Postingan baru muncul setelah refresh. Sumber high-fan-out dan inbox normal masih memerlukan penggabungan, tetapi sesi pemeringkatan yang lebih berat tidak diperlukan.
Lanjutan 4: Bagaimana Anda mengisolasi peningkatan tingkat duplikasi setelah rilis model pemeringkatan?
Bandingkan jumlah kandidat pra- dan pasca-dedup, ID pembuatan sesi, posisi kursor, dan catatan impresi berdasarkan versi model. Tentukan apakah duplikasi masuk melalui sumber, output peringkat, atau sesi yang hilang. Petakan alias sumber ke post_id otoritatif. Jika penyimpanan sesi tidak stabil (flapping), melakukan rollback pada model tidak akan membantu; pulihkan penyimpanan sesi dan buat klien me-refresh secara eksplisit.
Lanjutan 5: Bagaimana Anda tahu bahwa batas hybrid fan-out sudah benar?
Putar ulang (replay) distribusi jumlah pengikut dan aktivitas nyata secara offline. Perkirakan penulisan precompute, waktu tunggu antrean, penggabungan pembacaan, dan biaya cache-hit setiap penulis. Pindahkan batas secara bertahap saat online sambil mengamati p99 post-to-visible, p99 feed-read, total penulisan penyimpanan, dan tingkat degradasi. Tambahkan histeresis agar penulis tidak bergonta-ganti (flap) antara mode push dan pull.