Talaan ng nilalaman[Tago][Ipakita]
Ang Instagram Feed ay isang platform para sa pagbabahagi at pagkonekta sa mga tao at mga bagay na mahalaga sa iyo. Kapag binuksan mo ang Instagram o ni-refresh ang iyong feed, ang mga larawan at video na sa tingin namin ay magiging interesado ka ay lalabas sa itaas.
Ang news feed ay isang koleksyon ng mga item na naglalaman ng text, mga larawan, o mga video na ginawa ng iba pang mga entity sa system na naka-target para mabasa mo. Ito ay palaging nagbabago, habang ang ibang mga organisasyon ay gumagawa ng mga bagong post.
Sa post na ito, titingnan nating mabuti ang disenyo ng system ng feed ng Instagram. Kaya, magsimula tayo.
1. Mga Kinakailangan
Functional na pangangailangan
- Ang news feed ng user ay ginawa mula sa mga post mula sa ibang entity sa system kung saan sinundan o interesado ang user.
- Ang teksto, mga larawan, at mga video ay makikita lahat sa mga post.
- Dapat na ma-update ang news feed ng user sa mga bagong pag-post na ginawa ng iba.
Non-functional na pamantayan
- Ang paglikha ng mga news feed ay dapat maganap sa real-time. Ang end-user ay dapat makaranas lamang ng 12 segundo ng pagkaantala.
- Pagdaragdag ng bagong post: Dapat tumagal ng hindi hihigit sa 5 segundo para lumitaw ang isang bagong post sa isang kahilingan sa news feed pagkatapos itong maisumite sa system.
2. Pagtataya ng Kapasidad
- Noong Marso 2021, ang populasyon ng mundo ay 7.8 bilyong tao lamang. Ipinapahiwatig nito na 21% ng populasyon ng mundo ay isang Facebook DAU (Daily Active User) at 32% ay isang Facebook MAU (Monthly Active User) (Monthly Active User). Kahanga-hanga iyon.
- Ipagpalagay nating may 1 bilyong DAU ang sistemang ginagawa natin para mapadali ang mga bagay-bagay.
- Ipagpalagay na ang isang tao ay sumusunod sa 500 tao o mga negosyo sa Facebook. Ang isang pangkat o isang pahina ay maaaring ituring na isang entity.
Tinantyang Trapiko
Ipagpalagay na ang isang user ay nagda-download ng news feed nang 10 beses bawat araw sa karaniwan. Kaya ito ay humigit-kumulang 116K QPS at 1e10 na kahilingan bawat araw.
Mga pagtatantya ng Imbakan
Ipagpalagay na nagpapanatili kami ng 500 post mula sa news feed ng bawat user sa memorya sa average para sa mabilis na pagkuha, at ang bawat post ay 1KB ang laki. Kaya 500 KB bawat user, 500 TB para sa lahat ng DAU, at 5000 computer na may 100 GB RAM bawat isa.
3. Mga API para sa Mga System
userId (GUID): ang user na kinukuha ang news feed.
Ang mga sumusunod na field ay magagamit sa opsyonal na mga opsyon na parameter:
- afterPostId (GUID): kunin ang news feed mula sa post na sumusunod sa isang ito. Kung hindi tinukoy, kunin ang pinakabagong mga post.
- bilang (number): ang maximum na bilang ng mga post na maaaring ibalik ng bawat kahilingan. Ang backend ay nagtatakda ng default na maximum na numero kung walang ibinibigay.
- excludeReplies (boolean): pinipigilan ang mga tugon na maisama sa news feed.
- Ang ibinalik na JSON ay naglalaman ng listahan ng mga news feed item.
4. Pagdidisenyo ng isang Database
Mga Entity
- gumagamit
- Ang entityId, pangalan, paglalarawan, at timestamp ay lahat ng kinakailangang field.
- Ang mga sumusunod na field ay kinakailangan: PostId, pamagat, teksto, authorId, at timestamp.
- timestamp, url, at mediaId
Relasyon
- Maaaring sundan ng isang user ang Iba pang User o Entity. (m:n)
- Author-Post: Ang mga user at entity ay maaaring gumawa ng mga post. Ipagpalagay na ang mga User lang ang makakagawa ng Mga Post para sa pagiging simple. (1:n; authorId ay na-embed).
- Ang bawat post ay sinamahan ng ilang uri ng media. (1:n)
5. Mataas na Antas na Disenyo
Arkitektura
Workflows
Produksyon ng feed
Kapag hiniling ni Jay ang kanyang stream ng balita, gagawin ng system ang sumusunod:
- Kunin ang mga ID ng lahat ng tao at mga bagay na sinusundan ni Jay.
- Pinagsama-samang mga post: ibinigay ang mga ID na iyon, kunin ang pinakabago, sikat, at nauugnay na mga post.
- I-rank ang mga post ayon sa kanilang kaugnayan at timing.
- Cache: i-save ang mga ginawang feed at ipadala kay Jay ang nangungunang 20 post.
- Kapag natapos na ni Jay na basahin ang unang 20 post, isa pang kahilingan ang ipinadala para makuha ang susunod na 20 post.
Pamamahagi ng feed
Ipagpalagay na sinusundan ni Jay si Aayush at nag-post si Aayush ng anumang bago. Ang news feed ni Jay ay kailangang i-update ng system:
- Kunin ang mga ID ng mga tagasunod ni Aayush.
- Magdagdag ng mga bagong artikulo: Idagdag ang post ni Aayush sa news feed pool ng mga tagasubaybay ng mga ID na iyon.
- I-rank ang mga post ayon sa kanilang kaugnayan at timing.
- I-update ang cache ng ranking post.
- Dapat na maabisuhan ang mga tagasubaybay kapag na-publish ang mga bagong post.
Piraso
Ang mga koneksyon ng mga gumagamit ay pinananatili ng mga web server.
Ang mga pamamaraan na ipinahiwatig sa itaas ay isinasagawa ng server ng aplikasyon.
Cache at database:
- Relational database user/entity
- Relational database (post)
- Katangian ng larawan/video: Aayush storge
- Relational database metadata
Mga personalized na serbisyo:
- Produksyon ng feed
- Abiso ng mga feed
6. Detalyadong Disenyo
Pagbuo ng feed
Fan-out read walang muwang na pagpapatupad:
Kasama sa mga problema sa palpak na pagpapatupad na ito ang:
- Ang mga user na may malaking bilang ng mga kaibigan/tagasunod ay mapapansin ang isang makabuluhang paghina dahil kailangan nating salain, pagsamahin, at pagraranggo ng malaking bilang ng mga pag-post.
- Kapag ni-load ng user ang kanilang page, bubuo kami ng timeline. Maaari itong maging tamad at may maraming latency.
- Ang bawat update sa status ay magreresulta sa mga update sa feed para sa lahat ng mga tagasubaybay para sa mga live na update. Maaari itong magdulot ng malalaking pagkaantala sa aming Serbisyo sa Pagbuo ng Newsfeed.
Maaari naming paunang buuin ang chronology at i-save ito sa memorya upang mapataas ang kahusayan.
Offline na Produksyon (Fan-out write)
Maaari tayong magkaroon ng mga dedikadong server na patuloy na gumagawa at nag-iimbak ng mga newsfeed ng mga user sa memorya. Maaari lang naming ihatid ang feed ng balita mula sa paunang nabuo, naka-save na lokasyon sa tuwing gusto ito ng isang user.
Gaano karaming mga feed item ang dapat na itago sa memorya ng feed ng user?
Iangkop batay sa iyong gawi sa paggamit.
Dapat ba tayong gumawa ng newsfeed para sa lahat ng user (at itago ito sa memorya)?
- Para sa mga taong hindi madalas mag-log in.
- Ang LRU-based caching ay isang simpleng diskarte.
- Ang isang mas mahusay na solusyon ay upang malaman kung paano nag-log in ang mga gumagamit. Kailan ito? Aling weekdays ang sinasabi mo?
Paglalathala ng feed
Ang Fanout ay ang proseso ng pagpapadala ng post sa lahat ng iyong followers.
Fanout read(pull)
Kapag humiling ka ng news feed, makakatanggap ang system ng read request. Ang Fanout read ay nagpapadala ng kahilingan sa pagbabasa sa lahat ng iyong mga tagasunod, na humihiling sa kanila na basahin ang kanilang nilalaman.
Pros:
- Ang pamamaraan ng pagsulat ay mura.
- Kapag nagbabasa ng data, mas madaling gumamit ng iba't ibang algorithm ng pagsasama-sama.
cons:
- Para sa isang taong may maraming tagasunod, ang read operation ay medyo mahal.
- Hindi makakakita ang mga user ng bagong data hanggang sa makuha nila ito.
- Kapag nag-pull kami upang kunin ang pinakabagong mga pag-post nang regular, mahirap hanapin ang wastong pull cadence, at karamihan sa mga pull request ay magbabalik ng walang laman na sagot, na nagsasayang ng mga mapagkukunan.
Fanout write(push)
Ang isang kahilingan sa pagsulat ay ginawa sa system kapag nagpadala ka ng isang bagong post. Ang kahilingan sa pagsulat ay ipinapadala sa lahat ng iyong mga tagasubaybay upang i-update ang kanilang newsfeed gamit ang fanout write.
sa
- Ang proseso ng pagbabasa ay mura.
may
- Para sa isang user na may milyun-milyong tagasunod, ang magsulat masyadong mahal ang procedure.
Ang ranggo ng Feed
Sa halip na pag-order lang ng mga feed ayon sa pagkakasunud-sunod, ang mga algorithm sa pagraranggo ngayon ay nagtatangkang garantiya na ang mga item na may higit na kaugnayan ay inuuna.
- Pumili ng mga salik na makakatulong sa iyong magpasya sa kaugnayan ng isang feed item, gaya ng bilang ng mga like, komento, at pagbabahagi, ang oras na huling na-update ang item kung naglalaman ang artikulo ng mga larawan o video, at iba pa.
- Kalkulahin ang marka batay sa mga katangian.
- Gamitin ang puntos upang i-rank ang mga post.
Mag-set up ng mga KPI tulad ng pagpapanatili ng user, kita ng ad, at iba pa para makita kung gaano kabisa ang aming sistema ng pagraranggo.
Konklusyon
Sa kabila ng katotohanan na ang Instagram o ang pangunahing negosyo nito na Facebook ay isang malaking korporasyon, mayroon itong mas mahusay na pag-unawa sa disenyo ng sistema.
Sinubukan kong bigyan ka ng mataas na antas ng buod ng Instagram feed.
Sana ay nakatulong ito at magagamit mo ito nang mabuti.
Mag-iwan ng Sagot