Bab lan Paragraf[Singidaken][Tampilake]
Instagram Feed minangka platform kanggo nuduhake lan nyambungake karo wong lan perkara sing penting kanggo sampeyan. Nalika sampeyan mbukak Instagram utawa refresh feed, foto lan video sing kita pikir sampeyan bakal kasengsem bakal ditampilake ing ndhuwur.
Umpan warta minangka kumpulan item sing ngemot teks, gambar, utawa video sing digawe dening entitas liyane ing sistem sing ditargetake kanggo diwaca. Iku tansah ganti, nalika organisasi liyane nggawe kiriman anyar.
Ing kirim iki, kita bakal nliti desain sistem feed Instagram. Dadi, ayo miwiti.
1. Syarat
Kebutuhan fungsional
- Feed warta pangguna digawe saka kiriman saka entitas liyane ing sistem sing wis ditindakake utawa disenengi pangguna.
- Teks, gambar, lan video kabeh bisa ditemokake ing kiriman.
- Feed warta pangguna kudu dianyari karo postingan anyar sing digawe dening wong liya.
Kriteria non-fungsional
- Nggawe feed warta kudu ditindakake ing wektu nyata. Pangguna pungkasan kudu ngalami wektu tundha mung 12 detik.
- Nambah kiriman anyar: Sampeyan ngirim ora luwih saka 5 detik kanggo kirim anyar katon ing panjalukan news feed sawise dikirim menyang sistem.
2. Estimasi Kapasitas
- Ing Maret 2021, populasi donya mung 7.8 milyar wong. Iki nuduhake yen 21% saka populasi donya yaiku Facebook DAU (Daily Active User) lan 32% minangka Facebook MAU (Monthly Active User) (Monthly Active User). Sing apik tenan.
- Ayo padha ndalang yen sistem sing dibangun duwe 1 milyar DAU kanggo nggawe luwih gampang.
- Anggap wong ngetutake 500 wong utawa bisnis ing Facebook. Grup utawa kaca bisa uga dianggep minangka entitas.
Kira-kira Lalu Lintas
Anggap yen siji pangguna ngundhuh feed warta 10 kaping saben dina rata-rata. Dadi kira-kira 116K QPS lan 1e10 panjaluk saben dina.
Taksiran Panyimpenan
Nganggep kita njaga 500 kiriman saka saben feed warta pangguna ing memori rata-rata kanggo njupuk cepet, lan saben kirim ukuran 1KB. Dadi 500 KB saben pangguna, 500 TB kanggo kabeh DAU, lan 5000 komputer kanthi 100 GB RAM saben.
3. API kanggo Sistem
userId (GUID): pangguna sing feed warta lagi dijupuk.
Kolom ing ngisor iki kasedhiya ing parameter opsi opsional:
- afterPostId (GUID): entuk feed warta saka kiriman iki. Yen ora ditemtokake, entuk kiriman paling anyar.
- count (nomer): jumlah maksimum kiriman sing saben request bisa bali. Backend nyetel nomer maksimum standar yen ora ana sing diwenehake.
- excludeReplies (boolean): nyegah balesan ora kalebu ing feed warta.
- JSON bali ngemot dhaptar item feed warta.
4. Ngrancang Database
Entitas
- Pengguna
- entityId, jeneng, katrangan, lan cap wektu iku kabeh kolom sing dibutuhake.
- Kolom ing ngisor iki dibutuhake: PostId, judhul, teks, authorId, lan timestamp.
- timestamp, url, lan mediaId
sesambetan
- Pangguna utawa Entitas liyane bisa diterusake dening pangguna. (m:n)
- Penulis-Post: Pangguna lan entitas bisa nggawe kiriman. Nganggep mung Pangguna sing bisa nggawe Kiriman kanggo kesederhanaan. (1:n; authorId bisa dipasang).
- Saben kiriman diiringi sawetara wujud media. (1:n)
5. Desain Tingkat Dhuwur
arsitektur
Workflows
Produksi pakan
Nalika Jay njaluk stream warta dheweke, sistem bakal nindakake ing ngisor iki:
- Entuk ID kabeh wong lan barang sing dituruti Jay.
- Kiriman agregat: diwenehi ID kasebut, entuk kiriman paling anyar, populer, lan relevan.
- Rangking kiriman miturut relevansi lan wektune.
- Cache: simpen feed sing digawe lan kirim Jay 20 kiriman paling dhuwur.
- Nalika Jay wis rampung maca 20 kiriman pisanan, panjaluk liyane dikirim kanggo entuk 20 kiriman sabanjure.
Distribusi feed
Anggap Jay ngetutake Aayush lan Aayush ngirim apa wae sing anyar. Feed warta Jay kudu dianyari dening sistem:
- Nompo ID para pengikut Aayush.
- Tambah artikel anyar: Tambah kiriman Aayush menyang blumbang feed warta para pengikut ID kasebut.
- Rangking kiriman miturut relevansi lan wektune.
- Nganyari cache postingan peringkat.
- Pengikut kudu dilaporake nalika kiriman anyar diterbitake.
komponen
Sambungan pangguna dikelola dening server web.
Prosedur sing dituduhake ing ndhuwur ditindakake dening server aplikasi.
Cache lan database:
- Pangguna / entitas database relasional
- Database relasional (posting)
- Atribut gambar/video: Aayush storge
- Metadata database relasional
Layanan pribadi:
- Produksi pakan
- Kabar saka feed
6. Desain rinci
Generasi feed
Fan-metu maca implementasine naif:
Masalah karo implementasine sing ora apik iki kalebu:
- Pangguna sing duwe kanca/pengikut sing akeh bakal weruh kemerosotan sing signifikan amarga kita kudu nyaring, nggabung, lan menehi pangkat akeh postingan.
- Nalika pangguna mbukak kaca, kita nggawe garis wektu. Iki bisa dadi sluggish lan akeh latensi.
- Saben nganyari status bakal ngasilake nganyari feed kanggo kabeh pengikut kanggo nganyari langsung. Iki bisa nyebabake wektu tundha sing signifikan ing Layanan Generasi Newsfeed.
Kita bisa pra-generate kronologi lan nyimpen ing memori kanggo nambah efficiency.
Produksi Offline (Tulisan Fan-out)
Kita bisa duwe server darmabakti sing terus-terusan nggawe lan nyimpen newsfeed pangguna ing memori. Kita mung bisa ngirim feed warta saka lokasi sing wis digawe, disimpen kapan wae pangguna pengin.
Carane akeh item feed kudu feed pangguna disimpen ing memori?
Adaptasi adhedhasar prilaku panggunaan sampeyan.
Apa kita kudu nggawe newsfeed kanggo kabeh pangguna (lan disimpen ing memori)?
- Kanggo wong sing ora kerep mlebu log.
- Caching basis LRU minangka pendekatan sing gampang.
- Solusi sing luwih apik yaiku ngerteni carane pangguna mlebu. Kapan? Apa dina minggu sampeyan ngomong babagan?
Publikasi feed
Fanout minangka proses ngirim kiriman menyang kabeh pengikut sampeyan.
Fanout maca (tarik)
Nalika sampeyan njaluk feed warta, sistem nampa panjalukan diwaca. Fanout maca ngirim panjalukan maca menyang kabeh pengikut sampeyan, njaluk supaya maca konten kasebut.
Pros:
- Tata cara nulis ora larang.
- Nalika maca data, luwih gampang nggunakake macem-macem algoritma panggabungan.
cons:
- Kanggo wong sing akeh pengikut, operasi maca rada larang.
- Pangguna ora bakal weruh data anyar nganti ditarik.
- Nalika kita narik kanggo njupuk postingan paling anyar ing rutin, iku angel kanggo golek irama narik sing tepat, lan paling panjalukan narik bakal bali jawaban kosong, mbuang sumber daya.
Tulis Fanout (push)
A request nulis digawe kanggo sistem nalika sampeyan ngirim kirim anyar. Panjaluk nulis dikirim menyang kabeh pengikut sampeyan kanggo nganyari newsfeed nggunakake fanout write.
saben
- Proses maca ora larang.
cunt
- Kanggo pangguna kanthi jutaan pengikut, ing nulis prosedur kasebut larang banget.
Pangkat saka Feed
Tinimbang mung ngurutake feed kanthi kronologis, algoritma peringkat saiki uga nyoba njamin manawa item sing luwih relevan bakal diprioritasake.
- Pilih faktor sing bisa mbantu sampeyan nemtokake relevansi item feed, kayata jumlah seneng, komentar, lan enggo bareng, wektu item pungkasan dianyari yen artikel ngemot foto utawa video, lan sapiturute.
- Etung skor adhedhasar karakteristik.
- Gunakake skor kanggo rangking kiriman.
Nyetel KPI kaya retensi pangguna, penghasilan iklan, lan liya-liyane kanggo ndeleng efektifitas sistem peringkat kita.
kesimpulan
Senadyan kasunyatan manawa Instagram utawa bisnis induk Facebook minangka perusahaan gedhe, dheweke duwe pangerten sing luwih apik desain sistem.
Aku nyoba paling angel kanggo nyedhiyani sampeyan ringkesan tingkat dhuwur saka feed Instagram.
Muga-muga bisa migunani lan bisa digunakake kanthi apik.
Ninggalake a Reply