3. 1. Tamtay.vn
• Blog
• Photo
• Event
• Game
• …
SOCIAL
Content &
Entertainment
4. 1. Tamtay.vn
Mạng xã hội – Social network
• Từ năm 2007
• Đến tháng 11/2012
• ~ 9m registered users
• ~ 1m MAU
• Cấu thành từ 3 yếu tố
1. Chủ thể (subjects): người dùng, blog, album ảnh, game …
2. Quan hệ (relationships): bạn bè, hâm mộ, sở hữu …
3. Hành động (activities): kết bạn, đăng ảnh, chơi game …
5. 2. Redis & NoSQL
“Cặp đôi hoàn hảo”
> 1M người dùng
Memcache
6. 2. Redis & NoSQL
10M người dùng?
•PHP: ok
•MySQL: Chậm chạp, nhiều ràng buộc
•Memcache: đơn giản!
=> NoSQL
9. 2.1. Cache
• Cache dữ liệu theo trang: danh sách album mới nhất
• Memcache:
• Key: “album_list”
• Value: PHP array
• album_list[0] = array(item0, item1, … item 9);
• album_list[1] = array(item10, item11, … item 19);
• …
• Vấn đề: không linh hoạt trong việc thêm/bớt/sửa cache
10. 2.1. Cache
• Redis LISTS
• List “album_list”
• Lấy page đầu tiên:
• LRange(‘album_list’, 0, 9);
• Sửa phần tử trong cache:
• LSet(‘album_list, 7, $data);
• Thêm dữ liệu: LPush, RPush
• Mềm dẻo hơn memcache rất nhiều.
• Tiết kiệm bộ nhớ cho PHP.
11. 2.1. Cache
Benchmark:
•30 phần tử, chia làm 3 trang (mỗi trang 10 phần tử)
•Độ lớn mỗi phần tử: 1KB
•Thực hiện 1.000.000 lần việc lấy dữ liệu thuộc 1 trang ngẫu
nhiên (1-3)
•Thời gian trung bình:
• Redis: 0,36ms
• Memcache: 0,16ms
12. 2.2. Chat
• Instant Webchat
• History
• Offline messages
Vấn đề:
- Realtime over HTTP
- Presence System
- Message channel
13. 2.2. Chat
Normal POST
requests
/init
PHP Server
/online_list
/send_message
Redis
Chat -Database
Proxy -Message Queue
Clients System (Pub-Sub)
Tornado
Long-polling WebServer
request
Backend Scripts
/updates (Python) -Presence System
-Message Delivery System
15. 2.2. Chat
Message Channel
•A connect đến server: SUBSCRIBE channel_A;
•B connect đến server: SUBSCRIBE channel_B;
⇒Mỗi channel có nhiều subscribers
(mỗi user có nhiều connection đến server)
•A gửi tin cho B
• A: PUBLISH channel_B “nội dung chat”
• B(s) được notify: “nội dung chat” from A.
•Message Archive: SUBSCRIBE channel_*
16. 2.3. Friends
Vấn đề:
•~ 20M quan hệ bạn bè
•> 2M users có ít nhất 1 bạn
•Nhiều bạn nhất: ~7K uid friend_id created
•MySQL table với 20M dòng 1 2 1355130334
2 1 1355130334
• Query theo uid: chậm
• Insert / delete: chậm (indexing)
18. 2.3. Friends
Tính năng mới:
•Bạn chung của A và B:
• SINTER A_friends B_friends
•Bạn của bạn
• SUNION (SMEMBERS A_friends)_friends
Benchmark:
•Lấy danh sách bạn của 1 user bất kỳ
• Redis: 0,59ms
• MySQL: 0.95ms
19. 2.4. Feeds
Vấn đề:
•~1M MAU.
•Log hoạt động của người dùng: đăng blog, bình luận ảnh,
chơi game …
•~50M Activities log / tháng
•Feeds: danh sách hoạt động của bạn bè mình
•Mỗi người có trung bình 2,3 bạn
=> 2,3 x 50M = 115M feed / tháng!
•Nội dung từng feed khác nhau!
22. 2.4. Feeds
Vấn đề:
•HBase:
• Lưu trữ số lượng lớn: tốt
• Đọc số lượng lớn (vài nghìn – vài triệu dòng): tốt
• Đọc số lượng nhỏ: tệ!
Giải pháp: Redis
•Table user_timelines => mỗi user có 1 list
<uid>_timeline
chứa danh sách các log_id theo thứ tự thời gian
23. 3. Một số nhận
xét
Memcache
•Tốc độ tốt nhất
•Đơn giản và ít chức năng
Redis:
•Mềm dẻo. Có PHP Extension support
•Tương đối tốn RAM
⇒Đưa dữ liệu gì lên Redis?
HBase:
•Lưu trữ số lượng lớn. Độ ổn định cao
•Cấu trúc lưu trữ mềm dẻo => thay đổi tư duy thiết kế DB
•NoSQL: thay đổi tư duy lưu trữ & truy vấn dữ liệu.