สารบัญ[ซ่อน][แสดง]
WhatsApp เป็นโปรแกรมส่งข้อความโซเชียลที่อนุญาตให้ผู้ใช้แลกเปลี่ยนข้อความระหว่างกัน
คุณเคยพิจารณาว่า WhatsApp ทำงานอย่างไร?
แนวคิดที่สนับสนุนการสร้างและการดำเนินงานมีอะไรบ้าง?
บทความนี้จะกล่าวถึงพื้นฐานของ WhatsApp การออกแบบระบบ.
เราจะพูดถึงสถาปัตยกรรมทั่วไปของ WhatsApp ซึ่งสามารถใช้สร้างซอฟต์แวร์แชทประเภทใดก็ได้
มาดูการออกแบบระบบของ WhatsApp กันดีกว่า!
1. ข้อกำหนดที่สำคัญ
WhatsApp เป็นเทคโนโลยีที่ปรับขนาดได้สูงซึ่งมีผู้คนมากมายทั่วโลกใช้ ด้วยเหตุนี้ จึงควรได้รับการออกแบบมาอย่างดีเพื่อให้วางใจได้และใช้งานได้จริงตลอดเวลา
ด้วยเหตุนี้ การกำหนดความต้องการที่สำคัญของระบบจึงเป็นสิ่งสำคัญ
นี่คือข้อกำหนดขั้นต่ำสำหรับ WhatsApp Messenger:
- สามารถอำนวยความสะดวกในการโต้ตอบแบบตัวต่อตัว
- การรับรู้ข้อความและการดูครั้งล่าสุดเป็นไปได้ (ส่งแล้ว จัดส่งแล้ว และอ่านแล้ว)
- อนุญาตการเข้ารหัสตั้งแต่ต้นทางถึงปลายทางและรองรับสื่อ (รูปภาพ/วิดีโอ)
มาดูกันว่าบริการที่จำเป็นของเราต้องการความจุเท่าใด
2. การประมาณความจุ
วัตถุประสงค์ของเราคือการสร้างแพลตฟอร์มที่สามารถรองรับปริมาณการใช้งานจำนวนมากได้ สมมติว่ามีการส่ง SMS 10 พันล้านครั้งต่อวัน เรามี:
- ทุกๆ วัน มีผู้คนส่ง SMS จำนวน 10 พันล้านครั้ง
- ที่ปริมาณการใช้ข้อมูลสูงสุด (ต่อวินาที) มีผู้คนใช้งาน 700,000 คน (เฉลี่ย 6X)
- ระหว่างการใช้งานสูงสุด มีการส่งข้อความ 40 ล้านข้อความต่อวินาที
- ความยาวเฉลี่ยของข้อความคือ 160 อักขระ: 10B * 160 = 1.6TB ของข้อมูลถูกสร้างขึ้นทุกวัน
- ใช้บริการสิบปีเป็นตัวอย่าง: 10 * 1.6B * 365 PB
- แอปพลิเคชันทั้งหมดจะประกอบด้วยไมโครเซอร์วิส ซึ่งแต่ละแห่งจะทำงานเฉพาะด้าน สมมติว่าการส่งข้อความใช้เวลา 20 มิลลิวินาที และมีการเชื่อมต่อพร้อมกัน 100 ครั้งต่อเซิร์ฟเวอร์ ด้วยเหตุนี้ จำนวนเซิร์ฟเวอร์แชทที่ต้องการ = (ข้อความแชทต่อวินาที Latency)/ การเชื่อมต่อพร้อมกันต่อเซิร์ฟเวอร์ = 40M * 20ms / 100 = 8000 เซิร์ฟเวอร์
3. สถาปัตยกรรมระดับสูง
ระบบนี้สร้างขึ้นจากบริการหลักสองบริการ บริการแชทและบริการชั่วคราว เป็นต้น บริการแชทจะจัดการการรับส่งข้อมูลทั้งหมดที่เกิดจากข้อความออนไลน์ของผู้ใช้ พร้อมกันนี้บริการชั่วคราวจะจัดการการรับส่งข้อมูลเมื่อผู้ใช้ออฟไลน์
หากผู้ใช้ออนไลน์ บริการแชทจะรับผิดชอบในการส่งข้อความ
จะตรวจสอบว่าผู้รับข้อความออนไลน์หรือไม่ หากผู้รับออนไลน์ บริการนี้จะส่งข้อความทันที ถ้าผู้รับไม่ได้ออนไลน์ บริการชั่วคราวจะส่งข้อความถึงพวกเขาเมื่อพวกเขากลับมาออนไลน์
บริการชั่วคราวจะรักษาพื้นที่จัดเก็บแยกต่างหากสำหรับเก็บข้อมูลที่เข้าถึงได้ชั่วคราวจนกว่าผู้ใช้ออฟไลน์จะเชื่อมต่อใหม่
การออกแบบ API ระดับสูง
บริการนี้มี API การทำงานระดับสูงสองรายการสำหรับการส่งและการอ่านข้อความ ระบบสามารถใช้งานได้โดยใช้สถาปัตยกรรม REST
พารามิเตอร์สำหรับการส่งข้อความ
API นี้จะใช้เพื่อส่งข้อความระหว่างผู้ใช้สองคน
พารามิเตอร์ของการสนทนา
API นี้ใช้เพื่อแสดงการแชทแบบเธรด พิจารณาสิ่งนี้เป็นสิ่งแรกที่คุณจะเห็นเมื่อคุณเปิด WhatsApp เราต้องการรับข้อความสองสามข้อความสำหรับผู้ใช้หนึ่งรายในการสืบค้น API เดียว เพื่อจัดการกับสิ่งนี้ จำเป็นต้องมีพารามิเตอร์ออฟเซ็ตและจำนวนข้อความ
ฟีเจอร์ต่างๆ เช่น ดูล่าสุด ติ๊กเดียว และติ๊กสองครั้ง มีฟังก์ชันอะไรบ้าง
บทบาทสำคัญในการปรับใช้บริการเหล่านี้คือบริการตอบรับ คุณลักษณะเหล่านี้ได้รับการพัฒนาขึ้นเนื่องจากบริการนี้ยังคงสร้างและยืนยันคำตอบสำหรับการตอบรับต่อไป
- ขีดเดียว: เมื่อข้อความจากผู้ใช้ A ถึงผู้ใช้ B เซิร์ฟเวอร์จะส่งติ๊กเดียวเพื่อรับทราบว่าข้อความถูกส่งแล้ว
- ขีดสองครั้ง: หลังจากที่ข้อความของเซิร์ฟเวอร์ถูกส่งไปยังผู้ใช้ B ผ่านการเชื่อมต่อที่เหมาะสม ผู้ใช้ B จะรับทราบการรับข้อความไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะให้การตอบรับแก่ผู้ใช้ A อีกครั้ง เป็นผลให้เห็บที่ซ้ำกันจะปรากฏขึ้น
- เห็บสีน้ำเงิน: ผู้ใช้ B จะส่งข้อความตอบรับไปยังเซิร์ฟเวอร์อีกครั้งหลังจากตรวจสอบข้อความแล้ว เซิร์ฟเวอร์จะส่งข้อความตอบรับเพิ่มเติมให้กับผู้ใช้ A ขีดสีน้ำเงินจะปรากฏบนหน้าจอของผู้ใช้ A หลังจากนั้น
- เห็นครั้งสุดท้าย: กลไกการเต้นของหัวใจมีส่วนรับผิดชอบต่อคุณลักษณะที่เห็นล่าสุดทั้งหมด ทุกๆ 5 วินาที การเต้นของหัวใจจะถูกส่งไปยังเซิร์ฟเวอร์ ซึ่งจะคอยติดตามสถานะการดูล่าสุดของผู้ใช้แต่ละคนในตารางที่ผู้ใช้รายอื่นสามารถเข้าถึงได้ทันที
4. การออกแบบคุณสมบัติที่สำคัญ
ปฏิสัมพันธ์ส่วนบุคคล
นี่เป็นส่วนที่จำเป็นของบริการแชท ผู้ใช้สามารถส่งข้อความไปยังผู้ใช้รายอื่นโดยใช้บริการนี้ มาดูกันว่ามันทำงานอย่างไร:
สมมติว่า Jay ต้องการสื่อสารกับ Aayush Jay เชื่อมโยงกับเซิร์ฟเวอร์แชทซึ่งเขาได้รับข้อความ Jay ได้รับการยืนยันจากเซิร์ฟเวอร์แชทว่าข้อความถูกส่งออกไปแล้ว ขณะนี้เซิร์ฟเวอร์แชทกำลังขอข้อมูลจากที่เก็บข้อมูลเกี่ยวกับเซิร์ฟเวอร์แชทที่ Aayush เชื่อมต่ออยู่ เซิร์ฟเวอร์แชทของ Jay ส่งข้อความไปยังเซิร์ฟเวอร์แชทของ Aayush และ Aayush ได้รับข้อความผ่านกลไกการพุช ตอนนี้ Aayush ส่งข้อความตอบรับไปยังเซิร์ฟเวอร์แชทของ Jay ซึ่งจะแจ้ง Jay ว่าข้อความถูกส่งแล้ว ถ้า Aayush อ่านข้อความอีกครั้ง แสดงว่ามีการส่งข้อความใหม่ไปยัง Jay
สถานะของกิจกรรมผู้ใช้
ครั้งสุดท้ายที่มีคนเข้ามาใช้งานเป็นคุณลักษณะปกติของโปรแกรมส่งข้อความโต้ตอบแบบทันที
ระบบสำหรับรักษาการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์นั้นแสดงอยู่ในไดอะแกรมนี้ เว็บซ็อกเก็ตถูกใช้เพื่อสร้างการเชื่อมต่อแบบสองทิศทางระหว่างเซิร์ฟเวอร์และไคลเอนต์ การเชื่อมต่อเหล่านี้ส่งการเต้นของหัวใจ ซึ่งใช้เพื่อตรวจสอบสถานะกิจกรรมของผู้ใช้
ความเป็นส่วนตัวตั้งแต่ต้นทางถึงปลายทาง
การเข้ารหัสจากต้นทางถึงปลายทางเป็นคุณสมบัติหลักที่ทำให้มั่นใจได้ว่ามีเพียงผู้ใช้ที่สนทนาเท่านั้นที่สามารถอ่านการสื่อสารได้ คีย์สาธารณะถูกใช้ร่วมกันระหว่างผู้ใช้ทุกคนที่เกี่ยวข้องกับการสื่อสาร และมีความสำคัญต่อการรักษาการเข้ารหัสแบบ End-to-End สมมติว่ามีผู้ใช้สองคนในช่องคือ Jay และ Aayush ที่สื่อสารกัน
Jay มีกุญแจสาธารณะของ Aayush และ Aayush มีกุญแจสาธารณะของ Jay เช่นเดียวกับคีย์ส่วนตัวที่ไม่แชร์ ด้วยเหตุนี้ เมื่อ Jay ส่งข้อความ เขาเข้ารหัสด้วยกุญแจสาธารณะของ Aayush ซึ่งสามารถถอดรหัสได้ด้วยคีย์ส่วนตัวของ Aayush เท่านั้น
ในทำนองเดียวกัน Jay จะสามารถถอดรหัสการสื่อสารของ Aayush ได้เท่านั้น ด้วยเหตุนี้ มีเพียง Jay และ Aaysuh เท่านั้นที่สามารถมองเห็นการสื่อสารของกันและกัน และเซิร์ฟเวอร์จะทำหน้าที่เป็นเกตเวย์ในกระบวนการทั้งหมด
5. คอขวด
ทุกระบบมีแนวโน้มที่จะทำงานผิดพลาด ในการจัดการการรับส่งข้อมูลปริมาณมาก บริการต้องยังคงทำงานและทนต่อข้อผิดพลาดตลอดเวลาเพื่อหลีกเลี่ยงปัญหาคอขวด เนื่องจากบริการของเราอาศัยเซิร์ฟเวอร์ Chat และ Transient ทั้งหมด เราจึงต้องแก้ปัญหาทั้งหมดที่เกิดขึ้นจากการทำงานของเซิร์ฟเวอร์เหล่านั้น
ความล้มเหลวของเซิร์ฟเวอร์แชท: นี่คือหัวใจของระบบของเรา เมื่อผู้ใช้ออนไลน์ จะมีหน้าที่จัดการและส่งข้อความ เป็นผลให้ระบบนี้รักษาการเชื่อมโยงกับผู้ใช้
ด้วยเหตุนี้ หากบริการนี้ล้มเหลว สถาปัตยกรรมทั้งหมดจะได้รับผลกระทบ มีสองวิธีในการจัดการความล้มเหลวของเซิร์ฟเวอร์แชท วิธีหนึ่งคือเปลี่ยนการเชื่อมต่อ TCP ไปยังเซิร์ฟเวอร์อื่น ในขณะที่อีกวิธีหนึ่งคือการอนุญาตให้ผู้ใช้เริ่มการเชื่อมต่อโดยอัตโนมัติในกรณีที่การเชื่อมต่อขาดหาย
ความล้มเหลวของการจัดเก็บชั่วคราว: องค์ประกอบอื่นที่มีแนวโน้มว่าจะเกิดความล้มเหลวซึ่งในที่สุดอาจสร้างความเสียหายให้กับบริการทั้งหมดได้ก็คือที่จัดเก็บข้อมูลชั่วคราว ข้อความระหว่างเส้นทางไปยังผู้ใช้ออฟไลน์จะสูญหายหากบริการนี้ล้มเหลว
เราสามารถป้องกันข้อความสูญหายได้โดยการจำลองที่เก็บข้อมูลชั่วคราวของผู้ใช้แต่ละราย เป็นผลให้สามารถใช้แบบจำลองเพื่อประมวลผลฟังก์ชันทุกครั้งที่ผู้ใช้กลับมาออนไลน์ หากเซิร์ฟเวอร์ดั้งเดิมสามารถเข้าถึงได้ ทั้งอินสแตนซ์ดั้งเดิมและอินสแตนซ์ของที่เก็บข้อมูลชั่วคราวของผู้ใช้จะรวมกันเป็นร้านเดียว
6. เทคนิคการเพิ่มประสิทธิภาพ
ความแอบแฝง: เพื่อมอบประสบการณ์ลูกค้าที่ราบรื่นและปรับปรุงให้ดีขึ้น บริการ Messenger ต้องเป็นแบบเรียลไทม์ ด้วยเหตุนี้ เวลาแฝงจึงต้องลดลงโดยการแคชส่วนหนึ่งของข้อมูลที่เข้าถึงบ่อย เราสามารถแคชสถานะกิจกรรมของผู้ใช้และการสนทนาล่าสุดในหน่วยความจำโดยใช้แคชแบบกระจายเช่น Redis
ความพร้อมที่จะให้บริการ: เราต้องการบริการของเราเพื่อให้พร้อมใช้งานเป็นส่วนใหญ่ ระบบของเราต้องทนต่อข้อผิดพลาด ดังนั้นเราจึงสามารถเก็บสำเนาข้อความชั่วคราวไว้หลายชุด เพื่อให้ข้อความที่สูญหายสามารถกู้คืนจากข้อความที่ซ้ำกันได้อย่างรวดเร็ว ส่งผลให้ความพร้อมของระบบไม่ตกอยู่ในอันตราย
สรุป
ขณะนี้ระบบของเรารองรับความสามารถบางอย่างเท่านั้น แต่เราสามารถขยายเพื่อเพิ่มการแชทเป็นกลุ่มเพื่อแจกจ่ายข้อความไปยังบุคคลหลายคนได้อย่างง่ายดาย คุณยังสามารถให้ความสามารถวิดีโอและการโทร ระบบนี้ยังสามารถพัฒนาเพื่อให้ผู้ใช้สามารถเผยแพร่การอัพเดตสถานะหรือเรื่องเล่าและอ่านกัน
ฉันทำงานอย่างเต็มที่เพื่อให้คุณเห็นภาพรวมระดับสูงของการออกแบบระบบ WhatsApp ฉันหวังว่าคุณจะสนุกกับมันและจะนำไปใช้ให้เกิดประโยชน์
เขียนความเห็น