Các ứng dụng trực tuyến quy mô lớn đã có một chặng đường dài trong hai thập kỷ trước. Những đổi mới này đã thay đổi nhận thức của chúng tôi về phát triển phần mềm. Ví dụ, Facebook, Instagram và Twitter đều là những nền tảng có thể mở rộng.
Các hệ thống này phải được xây dựng để quản lý khối lượng lớn lưu lượng truy cập và dữ liệu vì hàng tỷ người sử dụng chúng cùng lúc trên khắp thế giới. Đây là khi thiết kế hệ thống vào hình ảnh.
Quá trình thiết lập kiến trúc, giao diện và dữ liệu cho một hệ thống đáp ứng các tiêu chí nhất định được gọi là thiết kế hệ thống. Thông qua các hệ thống gắn kết và hiệu quả, thiết kế hệ thống đáp ứng nhu cầu của doanh nghiệp hoặc tổ chức của bạn.
Khi công ty hoặc tổ chức của bạn đã xác định được tiêu chí của mình, bạn có thể bắt đầu kết hợp chúng vào một thiết kế hệ thống vật lý đáp ứng nhu cầu của người tiêu dùng.
Cho dù bạn chọn phát triển theo yêu cầu riêng, giải pháp thương mại hay kết hợp cả hai, cách bạn thiết kế hệ thống của mình sẽ quyết định cách bạn xây dựng nó.
Chúng tôi sẽ xem xét chi tiết thiết kế hệ thống của dòng thời gian Twitter trong bài đăng này, hoàn chỉnh với một hướng dẫn. Bắt đầu nào.
Bước 1: Phác thảo trường hợp sử dụng và các ràng buộc
Trường hợp sử dụng
- Một người dùng tải lên một tweet.
- Dịch vụ gửi thông báo đẩy và email đến những người theo dõi các tweet.
- Dòng thời gian của người dùng được xem (hoạt động từ người dùng)
- Người dùng xem dòng thời gian chính (hoạt động từ những người mà người dùng đang theo dõi)
- Từ khóa được người dùng tìm kiếm.
- Dịch vụ này thực sự có thể truy cập được.
Ra khỏi phạm vi
- Tweet được gửi đến Twitter Firehose và các luồng khác bằng cách sử dụng dịch vụ này.
- Dịch vụ loại bỏ các tweet dựa trên cài đặt hiển thị của người dùng.
- Nếu người dùng cũng không theo dõi người được trả lời, hãy ẩn câu trả lời.
- Hãy quan sát tùy chọn 'ẩn retweet'.
- phân tích
Ràng buộc và giả định
Giả định trạng thái
- Các lưu lượng truy cập không được phân tán như nhau.
- Nó phải đơn giản để gửi một tweet.
- Trừ khi bạn có hàng triệu người theo dõi, việc gửi một tweet cho tất cả những người theo dõi của bạn sẽ nhanh chóng.
- Có 100 triệu người dùng đang hoạt động.
- 15 tỷ tweet mỗi tháng hoặc 500 triệu tweet mỗi ngày
- Mỗi tweet có trung bình 10 lượt phân phối.
- Mỗi ngày, fanout cung cấp 5 tỷ tweet.
- Fanout cung cấp 150 tỷ tweet mỗi tháng.
- 250 tỷ yêu cầu đọc hàng tháng
- 10 tỷ lượt tìm kiếm hàng tháng
Lịch Trình Sự Kiện
- Dòng thời gian phải dễ điều hướng.
- Twitter thiên về đọc hơn là viết.
- Tối ưu hóa để đọc tweet nhanh
- Tiêu thụ tweet tốn nhiều thời gian.
Tìm kiếm
- Quá trình tìm kiếm sẽ nhanh chóng.
- Tốn thời gian tìm kiếm.
Tính toán mức sử dụng
Kích thước của mỗi tweet:
- Id tweet 8 byte
- 32 byte id người dùng
- 140 byte văn bản
- phương tiện - trung bình 10 KB
- Tổng: ~ 10 KB
Mỗi tháng, 150 TB nội dung tweet mới được tạo ra.
- * 500 triệu tweet mỗi ngày * 30 ngày mỗi tháng * 10 KB mỗi tweet
- Trong ba năm, đã có 5.4 PB nội dung tweet mới.
Có 100,000 yêu cầu đọc mỗi giây.
- * (400 yêu cầu mỗi giây / 1 tỷ yêu cầu mỗi tháng) 250 tỷ yêu cầu đọc mỗi tháng
Có 6,000 lượt tweet mỗi giây.
- * (400 yêu cầu mỗi giây / 1 tỷ yêu cầu mỗi tháng) 15 tỷ tweet mỗi tháng
Trên fanout, 60 nghìn tweet được gửi mỗi giây.
- Fanout cung cấp 150 tỷ tweet mỗi tháng * (400 yêu cầu mỗi giây / 1 tỷ yêu cầu mỗi tháng).
4,000 yêu cầu thông tin mỗi giây
- * (400 yêu cầu mỗi giây / 1 tỷ yêu cầu mỗi tháng) 10 tỷ lượt tìm kiếm mỗi tháng
Một số chuyển đổi hữu ích
- Mỗi tháng, 2.5 triệu giây trôi qua.
- 2.5 triệu yêu cầu mỗi tháng với 1 yêu cầu mỗi giây
- 100 triệu yêu cầu mỗi tháng x 40 yêu cầu mỗi giây
- 1 tỷ yêu cầu mỗi tháng = 400 yêu cầu mỗi giây
Bước 2: Sơ đồ cấp cao
Bước 3: Giải thích các thành phần cốt lõi
Chúng tôi có thể lưu các tweet của chính người dùng để điền vào dòng thời gian của người dùng (hoạt động từ người dùng) trong cơ sở dữ liệu quan hệ nếu họ gửi một tweet. Khó hơn để gửi tweet và phát triển dòng thời gian gia đình (hoạt động từ các cá nhân mà người dùng theo dõi).
Một cơ sở dữ liệu quan hệ điển hình sẽ bị choáng ngợp khi gửi các tweet cho tất cả những người theo dõi (60 nghìn tweet được gửi mỗi giây). Chúng tôi có thể sẽ muốn sử dụng bộ lưu trữ dữ liệu ghi nhanh như cơ sở dữ liệu NoSQL hoặc Bộ nhớ đệm bộ nhớ.
Đọc tuần tự 1 MB từ bộ nhớ mất khoảng 250 micro giây, nhưng đọc từ SSD mất 4 lần và đọc từ đĩa mất 80 lần.
Một Kho lưu trữ Đối tượng có thể được sử dụng để lưu trữ dữ liệu như hình ảnh và video.
- Máy chủ Web, đang hoạt động như một proxy ngược, nhận một tweet từ Máy khách.
- Yêu cầu được Web Server gửi đến máy chủ Write API.
- API Viết lưu tweet vào cơ sở dữ liệu SQL trong dòng thời gian của người dùng.
Dịch vụ Fan-Out được liên hệ với API Viết và nó thực hiện các tác vụ sau.
- Tìm kiếm những người theo dõi của người dùng trong Bộ nhớ Cache bằng cách truy vấn Dịch vụ Đồ thị Người dùng.
- Trên Memory Cache, tweet được lưu trong dòng thời gian chính của những người theo dõi người dùng.
- 1,000 người theo dõi = 1,000 lượt tìm kiếm và chèn = O (n) hoạt động.
- Tweet được lưu trong Dịch vụ chỉ mục tìm kiếm để tìm kiếm nhanh chóng.
- Object Store được sử dụng để lưu trữ phương tiện.
- Gửi thông báo đẩy cho người theo dõi qua Dịch vụ thông báo.
- Để gửi cảnh báo một cách không đồng bộ, nó sử dụng Hàng đợi.
Chúng ta có thể sử dụng danh sách Redis gốc với cấu trúc sau nếu Bộ nhớ Cache của chúng ta là Redis:
Dòng thời gian chính của người dùng sẽ được cập nhật với tweet mới, sẽ được lưu trữ trong Memory Cache. Chúng tôi sẽ sử dụng API REST công khai sau:
Dòng thời gian của người dùng được người dùng xem.
- Máy chủ Web nhận được yêu cầu dòng thời gian của người dùng từ Máy khách.
- Yêu cầu được gửi đến máy chủ API Đọc bởi Máy chủ Web.
- API Đọc truy vấn Cơ sở dữ liệu SQL cho khung thời gian của người dùng.
API REST sẽ hoạt động tương tự như dòng thời gian chính, ngoại trừ tất cả các tweet sẽ bắt nguồn từ người dùng chứ không phải những người họ theo dõi.
Người dùng tìm kiếm các từ khóa:
- Máy chủ Web nhận được yêu cầu tìm kiếm từ Máy khách.
- Yêu cầu được Web Server gửi đến máy chủ API Tìm kiếm.
Bước 4: Dòng thời gian Twitter
Tạo dòng thời gian là một nhiệm vụ khó khăn. Cần có một máy chủ tạo dòng thời gian liên kết đến các máy chủ web hoặc ứng dụng.
Mỗi khi người dùng đăng nhập, dịch vụ dòng thời gian sẽ duy trì theo dõi các tweet mới nhất từ những người dùng trong bảng của người theo dõi và cập nhật hoặc làm mới dòng thời gian của người dùng.
Chúng tôi không triển khai bất kỳ loại hệ thống xếp hạng nào ở đây; thay vào đó, chúng tôi giả định rằng 5 tweet hàng đầu từ những người theo dõi của người dùng được hiển thị trong dòng thời gian theo thứ tự thời gian tạo. Chúng tôi có thể duy trì giới hạn làm mới 50 tweet. Chúng tôi vẫn ngừng làm mới hoặc xây dựng tiến trình sau khi đạt đến ngưỡng đó cho đến khi người dùng làm mới trang.
Những lo ngại về độ trễ và hiệu suất cao sẽ đến từ việc tạo nguồn cấp dữ liệu trực tiếp của người dùng. Thay vào đó, tạo một luồng ngoại tuyến có thể được trình bày ngay lập tức là cách tốt nhất để cải thiện hiệu suất. Chạy các máy chủ dòng thời gian chuyên dụng thường xuyên ping máy chủ ứng dụng để làm mới nguồn cấp dữ liệu dựa trên thời gian nó được tạo.
Thuật toán xếp hạng nên xem xét các tín hiệu quan trọng và cung cấp trọng lượng để đảm bảo rằng dòng thời gian của người dùng không bị chi phối bởi tài liệu từ một hoặc nhiều tài khoản mà họ theo dõi.
Chính xác hơn, chúng ta có thể chọn các tính năng liên quan đến mức độ liên quan của bất kỳ mục nguồn cấp dữ liệu nào, chẳng hạn như số lượt thích, nhận xét, chia sẻ và thời gian cập nhật. Mỗi tiêu chí này sẽ được sử dụng để xếp hạng tweet và sau đó xếp hạng đó sẽ được sử dụng để hiển thị các tweet trên dòng thời gian.
Chúng ta có nên liên tục cảnh báo người dùng khi có nội dung mới cho nguồn cấp tin tức của họ không? Người dùng có thể thấy có lợi khi được thông báo khi có dữ liệu mới. Tuy nhiên, trên các thiết bị di động, khi việc sử dụng dữ liệu khá tốn kém, có thể gây lãng phí băng thông.
Do đó, chúng tôi có thể chọn không đẩy dữ liệu sang thiết bị di động và thay vào đó cho phép người dùng "Kéo để làm mới" cho các bài đăng mới.
Bước 5: Thiết kế tỷ lệ
Một điểm nghẽn tiềm năng là Dịch vụ Fanout. Người dùng Twitter với hàng triệu người theo dõi sẽ phải đợi vài phút để tweet của họ được tung ra. Điều này có thể gây ra một cuộc chạy đua với các câu trả lời cho tweet, mà chúng tôi có thể tránh bằng cách sắp xếp lại các tweet vào thời gian phục vụ.
Chúng tôi cũng có thể ngăn chặn việc lan truyền các tweet từ những người có số lượng lớn người theo dõi. Thay vào đó, chúng tôi có thể thực hiện tìm kiếm các tweet từ những cá nhân được theo dõi cao, tích hợp kết quả tìm kiếm với kết quả dòng thời gian chính của người dùng, sau đó sắp xếp lại các tweet tại thời điểm phân phát.
Các cải tiến bổ sung bao gồm:
- Chỉ giữ vài trăm tweet trong Bộ nhớ đệm cho mỗi dòng thời gian chính.
- Trong Bộ nhớ cache, chỉ thông tin dòng thời gian chính của người dùng đang hoạt động mới được lưu.
- Chúng tôi có thể xây dựng lại trình tự thời gian từ Cơ sở dữ liệu SQL nếu người dùng không hoạt động trong 30 ngày trước đó.
- Để biết người dùng là ai, hãy sử dụng Dịch vụ Đồ thị Người dùng.
- Thêm các tweet vào Bộ nhớ Cache bằng cách truy xuất chúng từ Cơ sở dữ liệu SQL.
- Dịch vụ Thông tin Tweet chỉ có thể tiết kiệm lượng tweet của một tháng.
- Trong Dịch vụ Thông tin Người dùng, chỉ những người dùng đang hoạt động mới được lưu.
- Để giữ cho độ trễ thấp, Cụm tìm kiếm rất có thể sẽ cần duy trì các tweet trong bộ nhớ.
Kết luận
Mặc dù Twitter là một tổ chức lớn, nhưng nó có một hiểu biết về thiết kế hệ thống. Tôi đã cố gắng hết sức để cung cấp cho bạn cái nhìn tổng quan cấp cao về dòng thời gian Twitter.
Tôi hy vọng bạn đã có được thông tin hữu ích từ nó và có thể sử dụng nó một cách tốt.
Bình luận