สารบัญ[ซ่อน][แสดง]
Instagram Feed เป็นแพลตฟอร์มสำหรับการแบ่งปันและเชื่อมต่อกับผู้คนและสิ่งต่าง ๆ ที่สำคัญสำหรับคุณ เมื่อคุณเปิด Instagram หรือรีเฟรชฟีด รูปภาพและวิดีโอที่เราคิดว่าคุณสนใจจะแสดงขึ้นด้านบน
ฟีดข่าวคือชุดของรายการที่มีข้อความ รูปภาพ หรือวิดีโอที่สร้างโดยหน่วยงานอื่นๆ ในระบบที่มีเป้าหมายให้คุณอ่าน มีการเปลี่ยนแปลงอยู่เสมอ ในขณะที่องค์กรอื่นๆ กำลังโพสต์ใหม่
ในโพสต์นี้ เราจะพิจารณาการออกแบบระบบฟีดของ Instagram อย่างใกล้ชิด เริ่มกันเลย
1 ความต้องการ
ความจำเป็นในการทำงาน
- ฟีดข่าวของผู้ใช้สร้างขึ้นจากโพสต์จากเอนทิตีอื่นในระบบที่ผู้ใช้ติดตามหรือสนใจ
- ข้อความ รูปภาพ และวิดีโอทั้งหมดอยู่ในโพสต์
- ฟีดข่าวของผู้ใช้ควรได้รับการอัปเดตด้วยการโพสต์ใหม่ที่สร้างโดยผู้อื่น
เกณฑ์ที่ไม่ทำงาน
- การสร้างฟีดข่าวควรเกิดขึ้นแบบเรียลไทม์ ผู้ใช้ปลายทางควรประสบกับความล่าช้าเพียง 12 วินาที
- การต่อท้ายโพสต์ใหม่: ควรใช้เวลาไม่เกิน 5 วินาทีก่อนที่โพสต์ใหม่จะปรากฏในคำขอฟีดข่าวหลังจากที่ส่งไปยังระบบ
2. การประมาณความจุ
- ณ เดือนมีนาคม พ.ศ. 2021 ประชากรโลกมีเพียง 7.8 พันล้านคน แสดงให้เห็นว่า 21% ของประชากรโลกเป็น Facebook DAU (ผู้ใช้ที่ใช้งานรายวัน) และ 32% เป็น Facebook MAU (ผู้ใช้ที่ใช้งานรายเดือน) (ผู้ใช้ที่ใช้งานรายเดือน) ที่น่าตื่นตาตื่นใจ
- สมมุติว่าระบบที่เรากำลังสร้างมี 1 พันล้าน DAU เพื่อทำให้สิ่งต่างๆ ง่ายขึ้น
- สมมติว่ามีคนติดตามผู้คนหรือธุรกิจ 500 คนบน Facebook กลุ่มหรือเพจอาจถือเป็นเอนทิตี
ปริมาณการใช้โดยประมาณ
สมมติว่าผู้ใช้รายหนึ่งดาวน์โหลดฟีดข่าวโดยเฉลี่ย 10 ครั้งต่อวัน ดังนั้นจึงมีคำขอประมาณ 116K QPS และ 1e10 ในแต่ละวัน
ประมาณการของการจัดเก็บ
สมมติว่าเรารักษาโพสต์ไว้ 500 โพสต์จากฟีดข่าวของผู้ใช้แต่ละคนในหน่วยความจำโดยเฉลี่ยสำหรับการดึงข้อมูลอย่างรวดเร็ว และแต่ละโพสต์มีขนาด 1KB ดังนั้น 500 KB ต่อผู้ใช้ 500 TB สำหรับ DAU ทั้งหมด และคอมพิวเตอร์ 5000 เครื่องที่มี RAM 100 GB
3. API สำหรับระบบ
userId (GUID): ผู้ใช้ที่มีการดึงข้อมูลข่าวสาร
ฟิลด์ต่อไปนี้มีอยู่ในพารามิเตอร์ตัวเลือกเสริม:
- afterPostId (GUID): รับฟีดข่าวจากโพสต์ต่อไปนี้ หากไม่ระบุ รับโพสต์ล่าสุด
- นับ (จำนวน): จำนวนโพสต์สูงสุดที่คำขอแต่ละรายการสามารถส่งคืนได้ แบ็กเอนด์ตั้งค่าจำนวนสูงสุดเริ่มต้นหากไม่มีการระบุ
- ไม่รวมการตอบกลับ (บูลีน): ป้องกันไม่ให้รวมการตอบกลับในฟีดข่าว
- JSON ที่ส่งคืนมีรายการฟีดข่าว
4. การออกแบบฐานข้อมูล
หน่วยงาน
- ผู้ใช้งาน
- รหัสเอนทิตี ชื่อ คำอธิบาย และการประทับเวลาเป็นฟิลด์บังคับทั้งหมด
- ต้องระบุฟิลด์ต่อไปนี้: PostId, title, text, authorId และ timestamp
- การประทับเวลา, url และ mediaId
ความสัมพันธ์
- ผู้ใช้หรือเอนทิตีอื่นๆ สามารถติดตามได้โดยผู้ใช้ (ม:น)
- Author-Post: ทั้งผู้ใช้และเอนทิตีสามารถสร้างโพสต์ได้ สมมติว่ามีเพียงผู้ใช้เท่านั้นที่สามารถสร้างโพสต์เพื่อความเรียบง่าย (1:n; authorId สามารถฝังได้)
- แต่ละโพสต์มาพร้อมกับสื่อบางรูปแบบ (1:น)
5. การออกแบบระดับสูง
สถาปัตยกรรม
เวิร์กโฟลว์
การผลิตอาหารสัตว์
เมื่อ Jay ขอสตรีมข่าว ระบบจะดำเนินการดังนี้:
- ดึง ID ของคนและสิ่งของทั้งหมดที่ Jay ติดตาม
- รวมโพสต์: ระบุ ID เหล่านั้น รับโพสต์ล่าสุด เป็นที่นิยม และเกี่ยวข้อง
- จัดอันดับโพสต์ตามความเกี่ยวข้องและระยะเวลา
- แคช: บันทึกฟีดที่สร้างขึ้นและส่งโพสต์ 20 อันดับแรกของ Jay
- เมื่อเจอ่าน 20 โพสต์แรกเสร็จ ก็ส่งคำขอไปอีก 20 โพสต์ต่อไป
การกระจายอาหาร
สมมติว่า Jay กำลังติดตาม Aayush และ Aayush โพสต์สิ่งใหม่ ระบบจะต้องอัปเดตฟีดข่าวของ Jay:
- ดึง ID ของผู้ติดตามของ Aayush
- เพิ่มบทความใหม่: เพิ่มโพสต์ของ Aayush ในกลุ่มฟีดข่าวของผู้ติดตาม ID เหล่านั้น
- จัดอันดับโพสต์ตามความเกี่ยวข้องและระยะเวลา
- อัปเดตแคชของโพสต์การจัดอันดับ
- ผู้ติดตามควรได้รับแจ้งเมื่อมีการเผยแพร่โพสต์ใหม่
ส่วนประกอบ
การเชื่อมต่อของผู้ใช้ได้รับการดูแลโดยเว็บเซิร์ฟเวอร์
ขั้นตอนที่ระบุไว้ข้างต้นดำเนินการโดยเซิร์ฟเวอร์แอปพลิเคชัน
แคชและฐานข้อมูล:
- ผู้ใช้ฐานข้อมูลเชิงสัมพันธ์/นิติบุคคล
- ฐานข้อมูลเชิงสัมพันธ์ (โพสต์)
- แอตทริบิวต์รูปภาพ/วิดีโอ: Aayush storge
- ข้อมูลเมตาฐานข้อมูลเชิงสัมพันธ์
บริการส่วนบุคคล:
- การผลิตอาหารสัตว์
- การแจ้งเตือนของฟีด
6. การออกแบบโดยละเอียด
การสร้างฟีด
Fan-out อ่านการใช้งานไร้เดียงสา:
ปัญหาในการใช้งานเลอะเทอะนี้รวมถึง:
- ผู้ใช้ที่มีเพื่อน/ผู้ติดตามจำนวนมากจะสังเกตเห็นการชะลอตัวอย่างมีนัยสำคัญ เนื่องจากเราต้องกลั่นกรอง รวม และจัดอันดับการโพสต์จำนวนมาก
- เมื่อผู้ใช้โหลดหน้าเว็บ เราจะสร้างไทม์ไลน์ การดำเนินการนี้อาจช้าและมีเวลาแฝงมาก
- การอัปเดตสถานะแต่ละครั้งจะส่งผลให้มีการอัปเดตฟีดสำหรับผู้ติดตามทั้งหมดสำหรับการอัปเดตแบบสด ซึ่งอาจทำให้เกิดความล่าช้าอย่างมากในบริการสร้างฟีดข่าวของเรา
เราสามารถสร้างลำดับเหตุการณ์ล่วงหน้าและบันทึกไว้ในหน่วยความจำเพื่อเพิ่มประสิทธิภาพ
การผลิตออฟไลน์ (เขียนแบบ Fan-out)
เราสามารถมีเซิร์ฟเวอร์เฉพาะที่สร้างและจัดเก็บฟีดข่าวของผู้ใช้ในหน่วยความจำอย่างต่อเนื่อง เราสามารถส่งฟีดข่าวจากตำแหน่งที่สร้างไว้ล่วงหน้าและบันทึกไว้ได้ทุกเมื่อที่ผู้ใช้ต้องการ
ฟีดของผู้ใช้ควรเก็บไว้ในหน่วยความจำกี่รายการ
ปรับตามพฤติกรรมการใช้งานของคุณ
เราควรสร้างฟีดข่าวสำหรับผู้ใช้ทั้งหมด (และเก็บไว้ในหน่วยความจำ) หรือไม่?
- สำหรับคนที่ไม่ค่อยได้เข้าระบบ
- การแคชที่ใช้ LRU เป็นแนวทางง่ายๆ
- ทางออกที่ดีกว่าคือการหาวิธีที่ผู้ใช้เข้าสู่ระบบ เมื่อไหร่? คุณกำลังพูดถึงวันธรรมดาวันไหน
การเผยแพร่ฟีด
Fanout คือกระบวนการในการส่งโพสต์ไปยังผู้ติดตามของคุณทุกคน
อ่าน Fanout (ดึง)
เมื่อคุณขอฟีดข่าว ระบบจะรับคำขออ่าน Fanout read ส่งคำขออ่านไปยังผู้ติดตามของคุณทุกคน โดยขอให้พวกเขาอ่านเนื้อหาของพวกเขา
จุดเด่น:
- ขั้นตอนการเขียนมีราคาไม่แพง
- เมื่ออ่านข้อมูล จะใช้อัลกอริธึมการรวมต่างๆ ได้ง่ายขึ้น
จุดด้อย:
- สำหรับคนที่มีผู้ติดตามจำนวนมาก การอ่านจะค่อนข้างแพง
- ผู้ใช้จะไม่เห็นข้อมูลใหม่จนกว่าจะดึงข้อมูล
- เมื่อเราดึงเพื่อดึงการโพสต์ล่าสุดเป็นประจำ เป็นการยากที่จะหาจังหวะการดึงที่เหมาะสม และคำขอดึงส่วนใหญ่จะส่งคืนคำตอบที่ว่างเปล่า ทำให้สิ้นเปลืองทรัพยากร
Fanout เขียน (ดัน)
มีการร้องขอการเขียนไปยังระบบเมื่อคุณส่งโพสต์ใหม่ คำขอเขียนจะถูกส่งไปยังผู้ติดตามของคุณทุกคนเพื่ออัปเดตฟีดข่าวโดยใช้ fanout write
มือโปร
- กระบวนการอ่านมีราคาไม่แพง
กับ
- สำหรับผู้ใช้ที่มีผู้ติดตามนับล้าน the เขียน ขั้นตอนมีราคาแพงเกินไป
อันดับของฟีด
แทนที่จะเรียงลำดับฟีดตามลำดับเวลา อัลกอริธึมการจัดอันดับในปัจจุบันยังพยายามรับประกันว่ารายการที่มีความเกี่ยวข้องมากขึ้นจะได้รับการจัดลำดับความสำคัญ
- เลือกปัจจัยที่สามารถช่วยคุณตัดสินใจความเกี่ยวข้องของรายการฟีด เช่น จำนวนการชอบ ความคิดเห็น และการแชร์ เวลาที่รายการได้รับการอัปเดตครั้งล่าสุดหากบทความมีรูปภาพหรือวิดีโอ เป็นต้น
- คำนวณคะแนนตามคุณสมบัติ
- ใช้คะแนนเพื่อจัดอันดับโพสต์
ตั้งค่า KPI เช่น การรักษาผู้ใช้ รายได้จากโฆษณา และอื่นๆ เพื่อดูว่าระบบการจัดอันดับของเรามีประสิทธิภาพเพียงใด
สรุป
แม้ว่าที่จริงแล้ว Instagram หรือธุรกิจแม่ของ Facebook จะเป็นบริษัทขนาดใหญ่ แต่ก็มีความเข้าใจใน การออกแบบระบบ
ฉันพยายามอย่างเต็มที่เพื่อให้ข้อมูลสรุประดับสูงของฟีด Instagram แก่คุณ
ฉันหวังว่ามันจะเป็นประโยชน์และคุณจะนำไปใช้ให้เกิดประโยชน์
เขียนความเห็น