การสัมภาษณ์การออกแบบระบบ: ออกแบบ 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สามารถช่วยให้คุณมีโครงสร้างที่ชัดเจนระหว่างรอบสัมภาษณ์แบบสด — เสนอมิติต่อไปที่ควรครอบคลุมและแสดงข้อแลกเปลี่ยนแบบเรียลไทม์ ทั้งหมดบนอุปกรณ์ของคุณเอง