Backend ที่ขยายได้สำหรับแอปที่ช่วยให้ผู้ใช้แชร์สถานที่ตั้งและค้นพบเพื่อนที่อยู่ใกล้ๆ
บทนำ
บทนี้มุ่งเน้นการออกแบบ Backend ที่ขยายได้สำหรับแอปที่เปิดให้ผู้ใช้แชร์สถานที่ตั้งและค้นพบเพื่อนที่ใกล้ๆ
ความแตกต่างจาก Proximity Service
ความแตกต่างหลักคือในบทนี้สถานที่เปลี่ยนแปลงอย่างต่อเนื่อง ในขณะที่ในบทนั้นที่อยู่ธุรกิจคงที่
Functional Requirements
- ผู้ใช้สามารถดูเพื่อนใกล้ๆ บนแอปมือถือ
- รายการเพื่อนใกล้ๆ อัปเดตทุกไม่กี่วินาที
Non-Functional Requirements
- Latency ต่ำ: สำคัญที่จะได้รับอัปเดตสถานที่โดยไม่มีความล่าช้ามาก
- ความน่าเชื่อถือ: ข้อมูลสูญหายบางส่วนรับได้ แต่ระบบควรพร้อมใช้งานทั่วไป
- Eventual Consistency: ข้อมูลสถานที่ไม่ต้องการ Strong Consistency
Components หลัก
WebSocket Servers
เซิร์ฟเวอร์ที่Stateful สำหรับการสื่อสารแบบReal-timeระหว่างไคลเอนต์และเซิร์ฟเวอร์
Redis Location Cache
ใช้เก็บข้อมูลสถานที่ล่าสุดสำหรับแต่ละผู้ใช้ที่Active
Redis Pub/Sub
Message Bus น้ำหนักเบาที่เปิดใช้ Topics สำหรับแต่ละUser Channelสำหรับอัปเดตสถานที่
Periodic Location Update Flow
- ไคลเอนต์มือถือส่งอัปเดตสถานที่ไปยังLoad Balancer
- Load Balancer ForwardอัปเดตไปยังWebSocket Server
- WebSocket Serverบันทึกข้อมูลสถานที่ในLocation Cache
- WebSocket Server Publishข้อมูลสถานที่ในUser Channelผ่านRedis Pub Sub
- Redis PubSub Broadcastอัปเดตไปยังเพื่อนที่เกี่ยวข้อง
เนื้อหานี้อ้างอิงจาก ByteByteGo - System Design Interview - An Insider's Guide