Гарчиг[Нуух][Үзүүлэх]
Instagram Feed бол танд чухал зүйл болон хүмүүстэй хуваалцах, холбогдох платформ юм. Инстаграмыг нээх юм уу мэдээллийн хэрэгслээ шинэчлэх үед бидний сонирхож буй зураг, видеонууд дээд талд харагдах болно.
Мэдээний хангамж нь систем дэх бусад байгууллагуудын бүтээсэн текст, зураг, видеог агуулсан, танд уншихад зориулагдсан зүйлсийн цуглуулга юм. Энэ нь үргэлж өөрчлөгдөж байдаг бол бусад байгууллагууд шинэ бичлэгүүд хийж байна.
Энэ нийтлэлд бид Instagram-ийн мэдээллийн системийн дизайныг нарийвчлан авч үзэх болно. За ингээд эхэлцгээе.
1. Шаардлага
Функциональ хэрэгцээ
- Хэрэглэгчийн мэдээний хангамж нь тухайн хэрэглэгчийн дагаж мөрдсөн эсвэл сонирхож буй системийн бусад байгууллагуудын нийтлэлээс үүсгэгддэг.
- Текст, зураг, видеог бүгдийг нь нийтлэлээс олж болно.
- Хэрэглэгчийн мэдээний хангамжийг бусдын үүсгэсэн шинэ нийтлэлүүдээр шинэчлэх ёстой.
Функциональ бус шалгуур
- Мэдээллийн хангамжийг бий болгох нь бодит цаг хугацаанд явагдах ёстой. Эцсийн хэрэглэгч зөвхөн 12 секундын саатлыг мэдрэх ёстой.
- Шинэ нийтлэл нэмэх: Шинэ нийтлэлийг системд оруулсны дараа мэдээний хүсэлтэд гарч ирэхэд 5 секундээс илүүгүй хугацаа шаардагдана.
2. Хүчин чадлын тооцоо
- 2021 оны гуравдугаар сарын байдлаар дэлхийн хүн ам ердөө 7.8 тэрбум хүн байна. Энэ нь дэлхийн хүн амын 21% нь Facebook DAU (Өдөр тутмын идэвхтэй хэрэглэгч), 32% нь Facebook MAU (сарын идэвхтэй хэрэглэгч) (сарын идэвхтэй хэрэглэгч) болохыг харуулж байна. Энэ бол гайхалтай.
- Бидний барьж буй систем нь ажлыг хөнгөвчлөхийн тулд 1 тэрбум DAU-тай гэж төсөөлье.
- Нэг хүн Facebook дээр 500 хүн эсвэл бизнесийг дагадаг гэж бодъё. Бүлэг эсвэл хуудсыг аж ахуйн нэгж гэж үзэж болно.
Тооцоолсон замын хөдөлгөөн
Нэг хэрэглэгч мэдээний хангамжийг өдөрт дунджаар 10 удаа татдаг гэж бодъё. Тиймээс өдөрт ойролцоогоор 116K QPS, 1e10 хүсэлт ирдэг.
Хадгалалтын тооцоо
Бид хэрэглэгч бүрийн мэдээний сувгаас 500 бичлэгийг санах ойд хадгалдаг бөгөөд бичлэг бүр нь 1KB хэмжээтэй байна гэж бодъё. Тиймээс хэрэглэгч бүрт 500 KB, бүх DAU-д 500 TB, тус бүр нь 5000 GB RAM-тай 100 компьютер.
3. Системд зориулсан API
userId (GUID): мэдээний хангамжийг татаж буй хэрэглэгч.
Нэмэлт сонголтуудын параметрт дараах талбарууд байна:
- afterPostId (GUID): дараах нийтлэлээс мэдээний хангамжийг аваарай. Хэрэв заагаагүй бол хамгийн сүүлийн үеийн нийтлэлүүдийг аваарай.
- тоо (тоо): хүсэлт бүрийг буцаах боломжтой бичлэгийн дээд тоо. Хэрэв байхгүй бол арын хэсэг нь хамгийн их тоог тогтоодог.
- excludeReplies (boolean): хариуг мэдээний тэжээлд оруулахаас сэргийлнэ.
- Буцаагдсан JSON нь мэдээний мэдээллийн хэрэгслийн жагсаалтыг агуулж байна.
4. Өгөгдлийн сангийн дизайн
Аж ахуйн нэгж
- Хэрэглэгчийн
- entityId, нэр, тайлбар, цагийн тэмдэг нь заавал байх ёстой талбарууд юм.
- Дараах талбарууд шаардлагатай: PostId, гарчиг, текст, зохиогчийн дугаар, цагийн тэмдэг.
- цагийн тэмдэг, url болон mediaId
хоорондын харилцаа
- Бусад хэрэглэгчид эсвэл аж ахуйн нэгжүүдийг хэрэглэгч дагаж болно. (м:н)
- Зохиогч-Нийтлэл: Хэрэглэгчид болон байгууллагууд хоёулаа нийтлэл үүсгэх боломжтой. Энгийн байх үүднээс зөвхөн Хэрэглэгчид нийтлэл үүсгэх боломжтой гэж бодъё. (1:n; зохиогчийн дугаарыг оруулах боломжтой).
- Нийтлэл бүрийг зарим төрлийн хэвлэл мэдээллийн хэрэгсэл дагалддаг. (1:n)
5. Өндөр түвшний дизайн
архитектур
Ажлын урсгал
Тэжээлийн үйлдвэрлэл
Жэй өөрийн мэдээний урсгалыг хүсэхэд систем нь дараах зүйлийг хийнэ.
- Жэйгийн дагадаг бүх хүмүүс болон зүйлсийн үнэмлэхийг аваарай.
- Нийтлэлүүдийг нэгтгэх: эдгээр ID-г өгснөөр хамгийн сүүлийн үеийн, алдартай, хамааралтай нийтлэлүүдийг аваарай.
- Бичлэгүүдийг хамааралтай, цаг хугацааны дагуу эрэмбэл.
- Кэш: үүсгэсэн мэдээллүүдийг хадгалж, шилдэг 20 бичлэгийг Жей рүү илгээ.
- Жэй эхний 20 бичлэгийг уншиж дуусаад дараагийн 20 бичлэгийг авах хүсэлтийг илгээдэг.
Тэжээлийн хуваарилалт
Жэй Аюушийг дагаж байгаа бөгөөд Аюуш шинэ зүйл нийтэлдэг гэж бодъё. Jay-ийн мэдээний хангамжийг системээр шинэчлэх шаардлагатай:
- Аюушийн дагалдагчдын үнэмлэхийг аваарай.
- Шинэ нийтлэл нэмэх: Ааюушийн нийтлэлийг тэдгээр ID-н дагагчдын мэдээний санд нэмнэ үү.
- Бичлэгүүдийг хамааралтай, цаг хугацааны дагуу эрэмбэл.
- Үнэлгээний нийтлэлийн кэшийг шинэчилнэ үү.
- Шинэ нийтлэл нийтлэгдсэн үед дагагчдад мэдэгдэх ёстой.
бүрэлдэхүүн хэсэг
Хэрэглэгчдийн холболтыг вэб серверүүдээр хангадаг.
Дээр дурдсан процедурыг програмын сервер гүйцэтгэдэг.
Кэш ба мэдээллийн сан:
- Харилцааны мэдээллийн баазын хэрэглэгч/байгууллага
- Харилцааны мэдээллийн сан (нийтлэл)
- Зураг/видео шинж чанар: Аайуш дэлгүүр
- Харилцааны мэдээллийн сангийн мета өгөгдөл
Хувийн үйлчилгээ:
- Тэжээлийн үйлдвэрлэл
- Тэжээлийн мэдэгдэл
6. Нарийвчилсан дизайн
Тэжээлийн үйлдвэрлэл
Fan-out уншсан гэнэн хэрэгжилт:
Энэхүү хайхрамжгүй хэрэгжилттэй холбоотой асуудлууд нь:
- Олон тооны найзууд/дагагчтай хэрэглэгчид бид олон тооны нийтлэлийг шүүж, нэгтгэж, эрэмбэлэх ёстой тул ихээхэн удаашралтай байгааг анзаарах болно.
- Хэрэглэгч өөрийн хуудсыг ачаалах үед бид цагийн хуваарийг бүтээдэг. Энэ нь удааширч, маш их хоцрогдолтой байж болно.
- Статусын шинэчлэлт бүр нь бүх дагалдагчдад шууд шинэчлэлтийн мэдээллийн шинэчлэлтийг бий болгоно. Энэ нь манай Newsfeed үүсгэх үйлчилгээнд ихээхэн саатал үүсгэж болзошгүй.
Бид үр ашгийг нэмэгдүүлэхийн тулд он цагийн дарааллыг урьдчилан үүсгэж, санах ойд хадгалах боломжтой.
Офлайн үйлдвэрлэл (Fan-out бичих)
Бид хэрэглэгчдийн мэдээний сувгийг санах ойд байнга үүсгэж хадгалдаг тусгай серверүүдтэй байж болно. Бид мэдээний хангамжийг хэрэглэгч хүссэн үедээ урьдчилан үүсгэсэн, хадгалсан байршлаас нь хүргэх боломжтой.
Хэрэглэгчийн тэжээл санах ойд хэдэн тэжээлийн зүйл хадгалах ёстой вэ?
Өөрийн хэрэглээний зан төлөвт тулгуурлан дасан зохицох.
Бид бүх хэрэглэгчдэд зориулсан мэдээллийн сувгийг (мөн санах ойд хадгалах) хэрэгтэй юу?
- Байнга нэвтэрдэггүй хүмүүст зориулав.
- LRU дээр суурилсан кэш хийх нь энгийн арга юм.
- Хэрэглэгчид хэрхэн нэвтэрч орохыг мэдэх нь илүү сайн шийдэл юм. Хэзээ вэ? Та ямар ажлын өдрүүдийн талаар ярьж байна вэ?
Тэжээлийн хэвлэлт
Fanout бол таны бүх дагалдагчдад нийтлэл илгээх үйл явц юм.
Фанут унших(татах)
Таныг мэдээний хангамж хүсэх үед систем унших хүсэлтийг хүлээн авдаг. Fanout read нь таны бүх дагалдагчдад унших хүсэлт илгээж, агуулгыг нь уншихыг хүсдэг.
Давуу тал:
- Бичих журам нь хямд.
- Өгөгдлийг уншихдаа янз бүрийн нэгтгэх алгоритмуудыг ашиглах нь илүү хялбар байдаг.
Байг:
- Олон дагагчтай хүний хувьд унших ажиллагаа нэлээд үнэтэй байдаг.
- Хэрэглэгчид үүнийг татах хүртэл шинэ өгөгдлийг харахгүй.
- Бид хамгийн сүүлийн үеийн нийтлэлүүдийг тогтмол татахын тулд татах үед зөв татах хэмнэлийг олоход хэцүү байдаг бөгөөд ихэнх татах хүсэлт нь хоосон хариултыг буцаан өгч, нөөцийг үрэх болно.
Фанут бичих(түлхэх)
Таныг шинэ нийтлэл илгээх үед системд бичих хүсэлт гарна. Бичлэгийн хүсэлтийг таны бүх дагагчдад fanout write ашиглан мэдээний сувгийг шинэчлэхийн тулд илгээсэн.
нь
- Унших үйл явц нь хямдхан байдаг.
Кон
- Олон сая дагагчтай хэрэглэгчийн хувьд бичих процедур нь хэтэрхий үнэтэй байдаг.
Тэжээлийн зэрэглэл
Өнөөдрийн эрэмбийн алгоритмууд нь зөвхөн тэжээлийг он цагийн дарааллаар эрэмбэлэхийн оронд илүү их хамааралтай зүйлсийг эрэмбэлэхийг баталгаажуулахыг хичээдэг.
- Таалагдсан, сэтгэгдэл, хуваалцсан тоо, нийтлэлд зураг эсвэл видео байгаа бол тухайн зүйл хамгийн сүүлд шинэчлэгдсэн цаг гэх мэт тэжээлийн зүйлийн хамаарлыг тодорхойлоход туслах хүчин зүйлсийг сонгоно уу.
- Оноо шинж чанарт үндэслэн тооцоол.
- Бичлэгүүдийг эрэмблэхийн тулд оноог ашиглана уу.
Манай зэрэглэлийн систем хэр үр дүнтэй болохыг харахын тулд хэрэглэгчийг хадгалах, зар сурталчилгааны орлого гэх мэт KPI-уудыг тохируулаарай.
Дүгнэлт
Хэдийгээр Instagram эсвэл түүний эцэг бизнес Facebook нь асар том корпораци боловч энэ талаар илүү сайн ойлголттой байдаг системийн дизайн.
Би Instagram мэдээллийн дээд түвшний хураангуйг танд өгөхийг хичээсэн.
Энэ нь тустай байсан бөгөөд та үүнийг сайн ашиглах болно гэж найдаж байна.
хариу үлдээх