Link to original video by sydexa
Discord đang lưu trữ hàng Nghìn Tỷ tin nhắn như thế nào?

Tóm tắt ngắn:
- Video kể về quá trình Discord giải quyết vấn đề lưu trữ hàng nghìn tỷ tin nhắn và đảm bảo hệ thống ổn định, đặc biệt là trong những thời điểm có lượng truy cập đột biến như trận chung kết World Cup 2022.
- Các công nghệ và phương pháp được đề cập bao gồm: sử dụng Cassandra, sau đó chuyển sang ScyllaDB, kỹ thuật gossip dance, tối ưu garbage collection, xây dựng data service bằng Rust (theo nguyên tắc Meme Driven Engineering), và công cụ migrate dữ liệu bằng Rust. Ví dụ cụ thể là việc xử lý lượng tin nhắn khổng lồ từ kênh Minecraft Official và sự tăng đột biến tin nhắn trong trận chung kết World Cup.
- Ứng dụng chính là khả năng lưu trữ và xử lý lượng dữ liệu khổng lồ một cách hiệu quả, đảm bảo trải nghiệm người dùng tốt ngay cả trong những sự kiện lớn. Quá trình này cũng cho thấy sự linh hoạt và khả năng thích ứng của hệ thống.
- Các quá trình được mô tả chi tiết bao gồm: quá trình chuyển đổi database từ Cassandra sang ScyllaDB, việc xây dựng và triển khai data service, và quá trình migrate dữ liệu.
Tóm tắt chi tiết:
Video được chia thành các phần chính như sau:
Phần 1: Vấn đề ban đầu và giải pháp ban đầu (Cassandra)
- Discord ban đầu sử dụng MongoDB, sau đó chuyển sang Cassandra năm 2017 để giải quyết vấn đề lưu trữ hàng tỷ tin nhắn.
- Hệ thống ban đầu sử dụng 12 node Cassandra, sau đó tăng lên 177 node vào đầu năm 2022. Tuy nhiên, sự gia tăng dữ liệu dẫn đến hiện tượng hot partition, gây mất cân bằng tải và độ trễ cao. Các partition chứa kênh có nhiều người dùng (ví dụ: Minecraft Official) bị quá tải.
- Discord áp dụng kỹ thuật gossip dance để tạm thời ngắt node khỏi luồng xử lý để thực hiện compaction, nhưng vẫn gặp khó khăn do thời gian compaction quá lâu và vấn đề garbage collection của JVM trong Cassandra gây ra độ trễ đột ngột, đòi hỏi phải khởi động lại node thủ công. "Chúng mình muốn có một giấc ngủ ngonnnnn :("
Phần 2: Tối ưu hóa và chuyển sang ScyllaDB
- Nhận thấy Cassandra không đáp ứng được nữa, Discord chuyển sang ScyllaDB, một cơ sở dữ liệu tương thích với Cassandra nhưng có hiệu suất cao hơn và không có garbage collector. ScyllaDB có kiến trúc Shard per core, giúp phân chia tải hiệu quả hơn.
- Trước khi chuyển, Discord xây dựng một data service bằng Rust (theo Meme Driven Engineering) nằm giữa API service và database. Data service hợp nhất các request giống nhau, giảm tải cho database, đặc biệt hiệu quả khi nhiều người dùng đọc cùng một tin nhắn. Consistent hashing được sử dụng để định tuyến request đến các instance của data service.
Phần 3: Quá trình migrate dữ liệu
- Quá trình chuyển dữ liệu từ Cassandra sang ScyllaDB ban đầu dự kiến mất 3 tháng nếu sử dụng phương pháp cut-over time.
- Tuy nhiên, bằng cách viết lại công cụ migrate dữ liệu bằng Rust (lại theo Meme Driven Engineering), Discord giảm thời gian xuống còn 9 ngày. Công cụ này chia nhỏ dữ liệu, lưu checkpoint vào SQLite để có thể tiếp tục quá trình nếu bị gián đoạn. Tốc độ migrate đạt 3.2 triệu tin nhắn/giây.
- Gặp sự cố nhỏ ở giai đoạn cuối do tombstone trong Cassandra, nhưng được giải quyết nhanh chóng.
Phần 4: Kết quả và bài học kinh nghiệm
- Sau khi chuyển sang ScyllaDB, số lượng node giảm từ 177 xuống 72. Độ trễ đọc giảm từ 40-125ms xuống 15ms, độ trễ ghi giảm khoảng 10 lần.
- Biểu đồ hệ thống cho thấy sự tăng đột biến tin nhắn trong trận chung kết World Cup 2022, minh họa hiệu quả của hệ thống sau khi tối ưu. "Đây là lý do hoàn hảo để xem bóng đá ngay trong giờ họp!"
- Video kết thúc bằng lời mời tham gia group chia sẻ về thiết kế hệ thống.
Video nhấn mạnh tầm quan trọng của việc lựa chọn công nghệ phù hợp, tối ưu hóa hệ thống, và khả năng thích ứng với sự thay đổi của dữ liệu. Việc sử dụng Rust và phương pháp Meme Driven Engineering cũng được đề cập như một yếu tố góp phần vào thành công của quá trình này.