design a scalable social network: problems and solutions
TRANSCRIPT
Design a scalable social network
Problems and solutions
Châu Nguyễn Nhật Thanh
December 8, 2016
Head of Game Backend and Cloud - VNG Corp.
Table of contents
1. Giới thiệu
2. Các module chính của MXH
3. Trang chủ
4. FriendList
5. Feed
6. Bonus
1
Giới thiệu
Về bản thân
Well-known as a:
• Technical Lead of ZingMe platform
• Technical Lead of Cyber Station Manager
• Co-Founder of VNG IoT LabGuest
Speaker at:
• PHPDay 2010, 2011, 2012
• Grokking Engineer
• Vietnam Web Submit
2
Các module chính của MXH
Trang chủ
Figure 1: Trang chủ facebook
3
Danh sách bạn bè
Figure 2: Facebook friend list
4
Photo
Figure 3: Facebook photo 5
Trang chủ
Thách thức
Cách làm thông thường:
• Web server kết nối đến
DB server
• Mỗi chức năng thể hiện
bằng 1 hoặc nhiều table
Với cách làm này:
• Latency cao do phải query vào nhiều bảng khác nhau
• Quá phức tạp khi thêm mới, nâng cấp tính năng
6
Giải pháp
Dùng cache để giảm
latency:
• Kết quả trả về từ
DB sẽ được lưu vào
cache
• Lần tiếp theo sẽ
truy cập vào cacheFigure 4: Numbers Everyone should
know,Jeff Dean, Google
7
Giải pháp
Để giảm độ phức tạp và dễ
dàng nâng cấp
• Tách thành những nhóm
nghiệp vụ nhỏ (service)
• Mỗi nhóm nghiệp vụ là 1
hệ thống độc lâp có
interface vào ra
• Các nhóm nghiệp vụ
tương tác nhau qua
interface này Figure 5: divide and conquer
8
Giải pháp
Figure 6: SNS components 9
FriendList
Thách thức
• Mỗi user có danh sách n bạn (fb=unlimited,zme=500,5K)
• Mỗi user có danh sách những người follow mình
• Thách thức
1. Kiểm tra xem 1 user nào đó có phải là bạn hay không?
2. Kiểm tra 1 user nào đó có đang follow ai không ?
3. Hôm nay là sinh nhật ai trong danh sách bạn mình ?
10
Giải pháp
1. Kiểm tra xem 1 user nào đó có phải là bạn hay không?
• Mỗi user có danh sách bạn là 1 tập hợp
• Thao tác tìm 1 user có phải là bạn không tương đương
với việc kiểm tra 1 phần tử có thuộc tập hợp đó không
• Redis cmd: SADD userId friendId, SISMEMBER userId
friendId
• Tìm bạn chung SINTER userIdA, userIdB, userIdC
11
Giải pháp
2. Kiểm tra 1 user nào đó có đang follow ai không ?
• Mỗi user có danh sách bạn là 1 bitmap (chuỗi bit 2 mũ
32 phần tử)
• Thao tác tìm 1 user có phải là bạn không tương đương
với việc kiểm tra bit tại vị trí thứ userId có bật lên không
• Redis cmd: SETBIT userId friendId 1, GETBIT userId
friendId
• Có vấn đề gì không??? BitMagic
12
Giải pháp
Figure 7: Follower list
13
Giải pháp
3. Hôm nay là sinh nhật ai trong danh sách bạn mình ?
• Mỗi ngày thứ n trong năm là 1 bitmap với vị trí thứ i
trong bitmap là userId thứ i có ngày sinh là ngày thứ n
trong năm
• Thao tác tìm trong danh sách bạn bè có ngày sinh là
ngày thứ n trong năm bằng cách lấy danh sách bạn dạng
bitmap and với bitmap ngày thứ n ở trên và lấy ra tập
các vị trí bằng 1
14
Giải pháp
Figure 8: Sinh nhật bạn bè
15
Feed
Thách thức
• Mỗi user có danh sách n bạn (fb=unlimited,zme=500,5K)
• Khi user thực hiện 1 hành động thì bạn bè của người đó
sẽ thấy hoạt động đó
• Thách thức
1. Kiến trúc như thế nào để đảm bảo latency?
2. Lưu trữ như thế nào để tiết kiệm storage mà vẫn đảm
bảo tốc độ truy cập?
16
Giải pháp
• Feed sẽ được lưu
trữ thành feedItem
và feedIdList
• Mỗi user có 1 danh
sách lưu trữ các
feedId tương ứng
với các action
(photo,blog...)
• Có 2 phương pháp
PUSH và PULL Figure 9: Chiến lược hiện thực hệ
thống news feed
17
Giải pháp
Figure 10: http://www.slideshare.net/mongodb/socialite-the-
open-source-status-feed18
Giải pháp
Figure 11: http://www.slideshare.net/mongodb/socialite-the-
open-source-status-feed19
Bonus
http://swagger.io/swagger-editor/
Figure 12: http://www.slideshare.net/pvullioud/swagger-
45508232?smtNoRedir=120
Hỏi đáp
21
The end
22