Soyo

Facebook Messenger - Constraints Estimation

Hôm nay mình sẽ đổi gió nghiên cứu cái vụ thiết kế hệ thống xem sao.
Biết đâu sau này có thể theo nghiệp Technical Architect. :3

Chat, ừm, từ hồi học cấp 2 đã biết đến Yahoo Messenger. Nhớ cái nick cũ =)) changtrai_codon_ditim_chanly_cuocdoi gạch dưới kute =)).
Hồi đó cũng máu đi trốn học online show cam rồi buzz gái các kiểu.
Giờ đỡ nhiều rồi :v.

Từ khi Y!M chết có rất nhiều cái tên đình đám nổi lên như BlackBerry Messenger(BBM), Skype, iMessage, Kakao Talk, Line, Hangouts, Việt Nam thì có Zalo và một số anh em không nổi tiếng mấy =))...

Fun fact:
WhatsApp was founded in 2009 by Brian Acton and Jan Koum
, former employees of Yahoo!. 
After leaving Yahoo! in September 2007
, they took some time off in South America. 
At one point, they applied for jobs at Facebook but were rejected.

Việc Facebook mua lại Whatsapp chắc cũng liên quan CV 2 ông này =)).

Chém gió đủ rồi đi vào vấn đề chính.
Trước tiên ta cần xác định một số yêu cầu cần thiết cho hệ thống của mình.

Functional Requirements:

- Quản lý tài khoản
- Hỗ trợ 1-to-1 nhắn tin riêng
- Hỗ trợ trạng thái online/offline của user
- Hỗ trợ lưu lịch sử chat vào DB 
(ông LINE thì chỉ lưu local .. 😤 .. làm mất lịch sử vì đổi device)

Non-functional Requirements:

- Real time chat với độ trễ nhỏ nhất ( < 1s nhỉ)
- Coi lại toàn lịch sử trên nhiều thiết bị
- High availability, tức là không down 24/7

Extended Requirement:

- Chat nhóm 
- Push notification
...

Tiếp theo là ước lượng lưu trữ và ràng buộc hệ thống

Giả sử chúng ta có 5 triệu user active hàng ngày, mỗi đứa nhắn tầm 50 tin nhắn.
Như vậy có khoảng 500 triệu tin nhắn mỗi ngày.

Định lượng ổ cứng:

Giả sử một tin nhắn cỡ 100bytes (khoảng 100 ký tự 1byte)
=> mỗi ngày cần: 5M user * 50 messages * 100bytes = 25GB/ngày
=> 5 năm lưu trữ : 25 * 365 * 5 ~= 45TB

Ngoài lưu tin nhắn còn lưu metadata, thông tin user... 100TB chắc ổn =))

Định lượng băng thông

25GB/ngày / 86400(s) ~ 300Kb/s (cũng ổn) 
chơi hẳn line 10MB cho máu (gởi và nhận nhân đôi lên hỉ) =))
Tổng tin nhắn hàng ngày 500M
Ổ cứng mỗi ngày 25GB
Ổ cứng 5 năm 45TB
Đọc 400Kb/s
Gởi 400Kb/s

Estimate xong rồi, chúng ta tiếp tục thiết kế và phân nhiệm vụ cho các node để đảm bảo cả functional và non-funtional requirement.

Screen-Shot-2019-09-27-at-11.07.53-PM

Workflow căn bản như sau:

  • UserA gởi tin nhắn đến User B thông qua Chat Server
  • Chat server nhận được tin nhắn và response về A là đã nhận được
  • Server lưu tin nhắn ở database và gởi đến UserB
  • UserB nhận được tin nhắn và thông báo lại với Chat Server là đã nhận được
  • Chat server thông báo ngược lại UserA là tin nhắn gởi thành công.

(còn tiếp)

Comments