การสัมภาษณ์การออกแบบระบบ: ออกแบบ WhatsApp
"ออกแบบ WhatsApp" ทดสอบการส่งข้อความแบบเรียลไทม์ในระดับขนาดใหญ่มาก การจัดเก็บข้อความอย่างถาวร สถานะ (ออนไลน์/เข้าใช้งานล่าสุด) และปัญหาการจัดการการเชื่อมต่อในการรักษาอุปกรณ์หลายร้อยล้านเครื่องให้เชื่อมต่ออยู่ เช่นเคย ผู้สัมภาษณ์ต้องการเห็นการให้เหตุผลและข้อแลกเปลี่ยนของคุณ ไม่ใช่สำเนาของระบบจริง
ทำอย่างเป็นระบบ: ชี้แจงความต้องการ ประมาณสเกล ออกแบบเส้นทางการเชื่อมต่อและการส่งข้อความ ตัดสินใจว่าจะเก็บข้อความอย่างไร จากนั้นจัดการแชทกลุ่มและกรณียากๆ เช่นการส่งข้อความแบบออฟไลน์และการรักษาลำดับ คู่มือด้านล่างนี้ทำตามเส้นทางนั้น
1. ชี้แจงความต้องการ
กำหนดขอบเขตก่อน หัวใจหลักคือการส่งข้อความแบบหนึ่งต่อหนึ่งที่เชื่อถือได้ ชี้แจงว่าแชทกลุ่ม มีเดีย และการเข้ารหัสแบบ end-to-end อยู่ในขอบเขตของรอบนี้หรือไม่
- เชิงฟังก์ชัน: ส่ง/รับข้อความ การยืนยันการส่งถึงและอ่านแล้ว สถานะออนไลน์ แชทกลุ่ม การส่งข้อความแบบออฟไลน์เมื่อผู้รับไม่ได้เชื่อมต่อ
- เชิงไม่ใช่ฟังก์ชัน: ความหน่วงต่ำ ความพร้อมใช้งานสูง ความคงทน (ไม่มีข้อความสูญหาย) การรักษาลำดับภายในบทสนทนา
- ต้องชี้แจง: การเข้ารหัสแบบ end-to-end และการจัดการมีเดีย — กล่าวถึงแล้วตัดสินใจอย่างชัดเจนว่าอยู่ในขอบเขตหรือไม่
2. ประมาณสเกล
กำหนดตัวเลขที่ขับเคลื่อนการออกแบบ สมมติว่ามีผู้ใช้ประมาณ 2 พันล้านคน และมีข้อความหลายหมื่นล้านข้อความต่อวัน นั่นหมายถึงหลายแสนข้อความต่อวินาทีในช่วงพีค และอุปกรณ์หลายร้อยล้านเครื่องที่เชื่อมต่อพร้อมกัน — การจัดการการเชื่อมต่อจึงกลายเป็นปัญหาสำคัญอันดับต้นๆ
3. เส้นทางการเชื่อมต่อและการส่งข้อความ
การรับส่งข้อความต้องการการเชื่อมต่อแบบต่อเนื่อง ไม่ใช่การ polling แบบ request/response อุปกรณ์จะคงการเชื่อมต่อ WebSocket ที่เปิดอยู่ไปยังเซิร์ฟเวอร์เกตเวย์ คอมโพเนนต์ส่วนกลางต้องรู้ว่าเกตเวย์ใดกำลังถือการเชื่อมต่อของผู้ใช้แต่ละคนอยู่ เพื่อให้สามารถส่งข้อความไปยังเซิร์ฟเวอร์ที่ถูกต้องได้
- เกตเวย์ WebSocket: คงการเชื่อมต่อที่ใช้งานอยู่ของอุปกรณ์ จัดการการส่ง/รับ
- Registry เซสชัน/สถานะ: แมปผู้ใช้ไปยังเซิร์ฟเวอร์เกตเวย์ปัจจุบัน (เช่น ใน Redis) อัปเดตเมื่อเชื่อมต่อ/ตัดการเชื่อมต่อ
- การเส้นทางข้อความ: เกตเวย์ของผู้ส่งค้นหาเกตเวย์ของผู้รับและส่งต่อ หากผู้รับออฟไลน์ ข้อความจะถูกเข้าคิว
4. การจัดเก็บข้อความและการส่งข้อความแบบออฟไลน์
ข้อความต้องคงอยู่ได้แม้ผู้รับตัดการเชื่อมต่อ จัดเก็บแต่ละข้อความอย่างถาวรและติดตามสถานะการส่งถึงตามผู้รับแต่ละคน ส่งทันทีหากผู้รับออนไลน์ มิฉะนั้นให้จัดเก็บและส่งต่อเมื่อผู้รับเชื่อมต่อใหม่ (store-and-forward)
รูปแบบการเข้าถึงที่เน้นการเขียนเป็นหลัก โดยมีคีย์ตามบทสนทนา เหมาะกับที่เก็บแบบ wide-column อย่าง Cassandra (ปริมาณการเขียนสูง ขยายตามแนวนอน) มากกว่าฐานข้อมูลเชิงสัมพันธ์เดียว เมื่อข้อความได้รับการยืนยันว่าส่งถึงผู้รับทุกคนแล้ว ก็สามารถลบหรือปล่อยให้หมดอายุได้ เนื่องจาก WhatsApp ไม่เก็บข้อความที่ส่งถึงแล้วไว้บนเซิร์ฟเวอร์อย่างไม่มีกำหนด
5. แชทกลุ่ม
การส่งข้อความกลุ่มคือการ fan-out: การส่งหนึ่งครั้งกลายเป็นการส่งถึง N ครั้ง สำหรับขนาดกลุ่มทั่วไป fan-out-on-write (การ push ไปยังเส้นทางการส่งของสมาชิกแต่ละคน) นั้นง่ายและอ่านได้เร็ว โปรดสังเกตข้อแลกเปลี่ยน — กลุ่มที่มีขนาดใหญ่มากทำให้ fan-out-on-write มีค่าใช้จ่ายสูง ซึ่งเป็นเหตุผลที่กลุ่มกระจายเสียงขนาดมหึมาเป็นปัญหาการออกแบบที่แตกต่างออกไป
6. ข้อแลกเปลี่ยนที่ควรพูดออกมา
ปิดท้ายด้วยความตึง: การรักษาลำดับ (เลขลำดับตามบทสนทนาเทียบกับลำดับแบบ global) ความสอดคล้องเทียบกับความพร้อมใช้งานสำหรับการยืนยัน (eventual consistency เพียงพอสำหรับ 'เข้าใช้งานล่าสุด' แต่ต้องเข้มงวดกว่าสำหรับการส่งถึง) และ fan-out-on-write เทียบกับ on-read สำหรับกลุ่ม การระบุสิ่งเหล่านี้อย่างชัดเจนคือสิ่งที่ทำให้คำตอบดูมีระดับ
ฝึกการออกแบบระบบของ WhatsApp พร้อมความช่วยเหลือแบบเรียลไทม์
ผู้ช่วยสัมภาษณ์การออกแบบระบบของ Nativelyสามารถช่วยให้คุณมีโครงสร้างที่ชัดเจนระหว่างรอบสัมภาษณ์แบบสด — เสนอมิติต่อไปที่ควรครอบคลุมและแสดงข้อแลกเปลี่ยนแบบเรียลไทม์ ทั้งหมดบนอุปกรณ์ของคุณเอง
