TL; DR:
พวกเขาใช้สถาปัตยกรรมสแต็กที่มีกราฟแคชสำหรับทุกสิ่งที่อยู่เหนือ MySQL ด้านล่างของสแต็ก
คำตอบยาว:
ฉันทำการค้นคว้าเกี่ยวกับเรื่องนี้ด้วยตัวเองเพราะฉันอยากรู้ว่าพวกเขาจัดการกับข้อมูลจำนวนมหาศาลของพวกเขาอย่างไรและค้นหาด้วยวิธีที่รวดเร็ว ฉันเคยเห็นคนบ่นเกี่ยวกับสคริปต์โซเชียลเน็ตเวิร์กที่ทำขึ้นเองช้าลงเมื่อฐานผู้ใช้เติบโตขึ้น หลังจากที่ฉันทำการเปรียบเทียบตัวเองกับผู้ใช้เพียง 10kคนและการเชื่อมต่อกับเพื่อน 2.5 ล้านคน - ไม่ได้พยายามที่จะกังวลเกี่ยวกับการอนุญาตกลุ่มและการชอบและโพสต์บนผนัง แต่กลับกลายเป็นว่าแนวทางนี้มีข้อบกพร่องอย่างรวดเร็ว ดังนั้นฉันจึงใช้เวลาค้นหาเว็บเกี่ยวกับวิธีทำให้ดีขึ้นและเจอบทความทางการของ Facebook นี้:
ฉันจริงๆแนะนำให้คุณดูการนำเสนอของลิงค์แรกข้างต้นก่อนที่จะอ่านต่อ อาจเป็นคำอธิบายที่ดีที่สุดว่า FB ทำงานอย่างไรเบื้องหลังที่คุณสามารถหาได้
วิดีโอและบทความจะบอกคุณบางสิ่ง:
- พวกเขาใช้ MySQL ที่ด้านล่างสุดของสแต็ก
- เหนือ SQL DB มีเลเยอร์ TAO ซึ่งมีการแคชอย่างน้อยสองระดับและใช้กราฟเพื่ออธิบายการเชื่อมต่อ
- ฉันไม่พบอะไรเลยเกี่ยวกับซอฟต์แวร์ / ฐานข้อมูลที่พวกเขาใช้สำหรับกราฟแคชของพวกเขา
ลองดูสิ่งนี้การเชื่อมต่อเพื่อนอยู่บนซ้าย:
นี่คือกราฟ :) ไม่ได้บอกวิธีสร้างใน SQL มีหลายวิธีในการทำ แต่ไซต์นี้มีวิธีการที่แตกต่างกันมากมาย ข้อควรสนใจ:พิจารณาว่าฐานข้อมูลเชิงสัมพันธ์คืออะไร: คิดว่าจะจัดเก็บข้อมูลที่เป็นมาตรฐานไม่ใช่โครงสร้างกราฟ ดังนั้นมันจะทำงานได้ไม่ดีเท่ากับฐานข้อมูลกราฟเฉพาะ
พิจารณาด้วยว่าคุณต้องทำแบบสอบถามที่ซับซ้อนมากกว่าแค่เพื่อนของเพื่อนเช่นเมื่อคุณต้องการกรองสถานที่ทั้งหมดรอบพิกัดที่คุณและเพื่อนของคุณชอบ กราฟเป็นคำตอบที่สมบูรณ์แบบที่นี่
ฉันไม่สามารถบอกคุณได้ว่าจะสร้างมันอย่างไรจึงจะทำงานได้ดี แต่ต้องมีการลองผิดลองถูกและการเปรียบเทียบอย่างชัดเจน
นี่คือของฉันที่น่าผิดหวังสำหรับการทดสอบเพียงแค่เพื่อนผลการวิจัยของเพื่อน:
สคีมา DB:
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
คำถามเพื่อนของเพื่อน:
(
select friend_id
from friends
where user_id = 1
) union (
select distinct ff.friend_id
from
friends f
join friends ff on ff.user_id = f.friend_id
where f.user_id = 1
)
ฉันขอแนะนำให้คุณสร้างข้อมูลตัวอย่างโดยมีระเบียนผู้ใช้อย่างน้อย 10,000 รายการและแต่ละรายการมีการเชื่อมต่อกับเพื่อนอย่างน้อย 250 คนจากนั้นเรียกใช้แบบสอบถามนี้ ในเครื่องของฉัน (i7 4770k, SSD, 16gb RAM) ผลลัพธ์คือ~ 0.18 วินาทีสำหรับข้อความค้นหานั้น บางทีมันอาจจะปรับให้เหมาะสมฉันไม่ใช่ DB อัจฉริยะ (ยินดีรับข้อเสนอแนะ) อย่างไรก็ตามหากการปรับขนาดตามเส้นตรงแสดงว่าคุณอยู่ที่ 1.8 วินาทีสำหรับผู้ใช้เพียง 100,000 คน 18 วินาทีสำหรับผู้ใช้ 1 ล้านคน
สิ่งนี้อาจฟังดูโอเคสำหรับผู้ใช้ ~ 100,000 คน แต่ให้พิจารณาว่าคุณเพิ่งดึงเพื่อนของเพื่อนมาและไม่ได้ทำแบบสอบถามที่ซับซ้อนเช่น " แสดงเฉพาะโพสต์จากเพื่อนของเพื่อน + ตรวจสอบสิทธิ์ว่าฉันอนุญาตหรือไม่อนุญาต เพื่อดูบางส่วน + ทำแบบสอบถามย่อยเพื่อตรวจสอบว่าฉันชอบสิ่งใด " คุณต้องการให้ฐานข้อมูลตรวจสอบว่าคุณชอบโพสต์แล้วหรือไม่หรือคุณจะต้องทำโค้ด นอกจากนี้โปรดพิจารณาด้วยว่านี่ไม่ใช่คำค้นหาเดียวที่คุณเรียกใช้และคุณมีผู้ใช้ที่ใช้งานอยู่มากกว่าในเวลาเดียวกันบนไซต์ที่ได้รับความนิยมไม่มากก็น้อย
ฉันคิดว่าคำตอบของฉันตอบคำถามว่า Facebook ออกแบบความสัมพันธ์กับเพื่อนได้ดีแค่ไหน แต่ฉันขอโทษที่ฉันไม่สามารถบอกคุณได้ว่าจะใช้มันอย่างไรเพื่อให้ทำงานได้เร็ว การติดตั้งโซเชียลเน็ตเวิร์กเป็นเรื่องง่าย แต่การตรวจสอบให้แน่ใจว่าทำงานได้ดีนั้นไม่ชัดเจน - IMHO
ฉันได้เริ่มทดลองใช้ OrientDB เพื่อทำการสืบค้นกราฟและแมปขอบของฉันกับ SQL DB ถ้าฉันทำสำเร็จฉันจะเขียนบทความเกี่ยวกับเรื่องนี้