Chương 1: Tổng quan về thiết kế hệ thống Thiết kế hệ thống là quá trình định rõ các thành phần, cách chúng tương tác, các giao diện lập trình ứng dụng (APIs), và mô hình dữ liệu để xây dựng các hệ thống với quy mô lớn, đáp ứng đầy đủ yêu cầu chức năng và phi chức năng. Trong quá trình thiết kế hệ thống, chúng tôi tận dụng các khái niệm từ lĩnh vực mạng máy tính, tính toán song song, và hệ thống phân tán để xây dựng những hệ thống có khả năng mở rộng và hiệu suất cao. thêm tính năng mới mà không làm ảnh hưởng đến tính ổn định và hiệu suất. Mục tiêu chính của thiết kế hệ thống là tạo ra những hệ thống hiệu quả, đáng tin cậy và dễ bảo trì.
Hệ thống hiệu quả là những hệ thống linh hoạt, có khả năng đáp ứng đầy đủ nhu cầu của người dùng và doanh nghiệp. Hệ thống đáng tin cậy được xây dựng với khả năng xử lý lỗi, sự cố và sai sót. Hệ thống dễ bảo trì là những hệ thống linh hoạt, dễ mở rộng hoặc thu nhỏ, và có khả năng 1. Thiết kế trong các hệ thống nhỏ và trong các hệ thống lớn 1.
Thiết kế trong hệ thống nhỏ Với những hệ thống nhỏ và tương đối đơn giản, quá trình thiết kế và kiến trúc không gặp nhiều phức tạp. Những hệ thống này thường dễ tổ chức, vận hành, và bảo trì, đồng thời không có quá nhiều thành phần phức tạp. Đối với những hệ thống này, có nhiều mô hình phát triển phần mềm phù hợp với yêu cầu cụ thể của chúng. Các kiến trúc như client-server, layer, monolithic đều là những lựa chọn linh hoạt, phản ánh sự đa dạng trong cách triển khai mô hình phần mềm.
Việc sử dụng các mô hình như client-server giúp tách biệt giữa phần giao diện người dùng và phần xử lý logic, giảm sự phức tạp và tăng tính linh hoạt. Kiến trúc layer thường được ưa chuộng với những hệ thống có nhiều tầng chức năng, giúp quản lý và phát triển một cách hiệu quả. Trong khi đó, kiến trúc monolithic, mặc dù đơn giản, nhưng lại thích hợp cho những ứng dụng nhỏ với quy mô và yêu cầu thấp. Tổng cộng, sự linh hoạt trong lựa chọn kiến trúc giúp phát triển những hệ thống nhỏ một cách hiệu quả, tùy thuộc vào yêu cầu cụ thể và quy mô của dự án.
Hình 1: Kiến trúc Layer Hình 2: Kiến trúc monolithic Hình 3: Kiến trúc Client-Server Một điểm chung của các loại kiến trúc này là chúng đều sử dụng mô hình tập trung, điều này mang lại một số thách thức cụ thể: Về Hiệu Suất: Các hạn chế về vật lý của phần cứng như việc nâng cấp CPU, RAM, hay ổ cứng đặt ra giới hạn đối với một máy chủ cụ thể. Đối với các hệ thống lớn, có mô hình nghiệp vụ phức tạp và số lượng người sử dụng lớn, các mô hình kiến trúc trên có thể gặp khó khăn trong việc cung cấp dịch vụ một cách kịp thời, chính xác, và ổn định. Nâng cấp hiệu suất của một máy chủ đơn lẻ trở nên đắt đỏ sau một ngưỡng nhất định. Về Mở Rộng: Quản lý và xử lý dữ liệu đóng góp vào giá trị của hệ thống phần mềm.
Khi lượng khách hàng tăng, hệ thống phải xử lý thêm lưu lượng và lưu trữ lượng dữ liệu lớn hơn. Tuy nhiên, hệ thống chỉ dựa vào một máy chủ duy nhất sẽ đạt đến giới hạn mở rộng. Về Sẵn Sàng: Dịch vụ trực tuyến ngày nay yêu cầu hoạt động liên tục (24/7), điều này là một thách thức đối với các hệ thống. Đối với các dịch vụ đặt ra yêu cầu về "sẵn sàng" 5-9, tức là hoạt động 99.999% thời gian, hệ thống tập trung trên một máy chủ sẽ gặp khó khăn khi phải đối mặt với hàng nghìn, hàng chục nghìn, thậm chí triệu yêu cầu cùng lúc.2 Thiết kế trong hệ thống lớn Để giải quyết các vấn đề của những hệ thống nhỏ, việc thiết kế hệ thống lớn cần phải áp dụng những kiến trúc phức tạp, đặc biệt hơn để đáp ứng nhu cầu chịu tải lớn, đảm bảo độ ổn định, độ chính xác và có khả năng chịu lỗi.
Một hệ thống có các nhu cầu trên thông thường sẽ sử dụng nhiều server, mỗi server song song chạy chương trình và nhiều cơ sở dữ liệu để đáp ứng nhu cầu lưu trữ. Thiết kế hệ thống hiện đại với Khối Xây Dựng (Building Blocks) Trong thiết kế hệ hiện đại, những thành phần thiết kế cơ bản như cân bằng tải (Load balancer) sẽ được tách ra thành các khối xây dựng cơ bản (Building block). Điều này phục vụ cho 2 mục đích: Thứ nhất, có thể thảo luận về tất cả khối xây và các vấn đề thiết kế của chúng. Thứ hai, khi giải quyết một vấn đề thiết kế, có thể tập trung vào các khía cạnh cụ thể của vấn đề, đề cập đến các khối xây dựng nhất định và cách sử dụng chúng.
Điều này giúp loại bỏ các cuộc thảo luận trùng lặp về các yếu tố thiết kế thường xuyên xảy ra. Chi tiết 16 khối xây dựng: 1. Hệ thống tên miền (Domain Name System: DNS): Khối này tập trung vào cách thiết kế các hệ thống đặt tên phân cấp và phân tán cho các máy tính được kết nối với Internet thông qua các giao thức Internet khác nhau. Bộ cân bằng tải (Load Balancers): Khối này được sử dụng để phân phối cân bằng các yêu cầu đến từ khách hàng đến một nhóm máy chủ có sẵn.
Nó cũng giảm tải và có thể bỏ qua các máy chủ khi gặp sự cố. Cơ sở dữ liệu (Databases): Khối này cho phép lưu trữ, truy xuất, sửa đổi và xóa dữ liệu liên quan đến các thủ tục xử lý dữ liệu khác nhau như là các loại cơ sở dữ liệu, sao chép, phân vùng và phân tích của cơ sở dữ liệu phân tán. Bộ lưu trữ Khóa-Giá trị (Key-Value store): Khối này là cơ sở dữ liệu phi quan hệ, cho phép lưu trữ dữ liệu dưới dạng cặp khóa-giá trị. Mạng phân phối nội dung (Content Delivery Network: CDN): Khối này được sử dụng để lưu trữ nội dung lan truyền như video, hình ảnh, âm thanh và trang web.
Nó hiệu quả trong việc phân phối nội dung cho người dùng cuối mà vẫn giảm thiểu độ trễ và gánh nặng cho các dữ liệu trung tâm. Bộ tạo số thứ tự (Sequencer): Khối này được dùng để tạo số ID duy nhất. Bảng giám sát dịch vụ (Service Monitoring): Khối này quan trọng trong các hệ thống phân tán chúng giúp phân tích hệ thống và cảnh báo cho các bên liên quan nếu xảy ra vấn đề. Bộ đệm phân tán (Distributed Caching): Khối này là một hệ thống đệm phân tán trong đó nhiều máy chủ đệm phối hợp để lưu trữ dữ liệu được truy cập thường xuyên.
Hàng đợi tin nhắn phân tán (Distributed Messaging Queue): Khối này là một hệ thống hàng đợi tin nhắn phân tán bao gồm nhiều máy chủ, được sử dụng giữa các thực thể tương tác được gọi là nhà sản xuất và người tiêu dùng. Nó giúp tách biệt nhà sản xuất và người tiêu dùng, đảm bảo tính mở rộng độc lập và cải thiện độ tin cậy. Hệ thống xuất bản-đăng ký (Publish-Subscribe System): Khối này là một phương pháp giao tiếp không đồng bộ giữa các dịch vụ. Hệ thống này được phổ biến trong kiến trúc serverless, microservices và hệ thống xử lý dữ liệu.
Bộ giới hạn tốc độ (Rate Limiter): Khối này là hệ thống giới hạn số lượng yêu cầu đến cho một dịch vụ dựa trên giới hạn được xác định trước. Hệ thống này thường được sử dụng như một lớp phòng thủ cho các dịch vụ để tránh việc sử dụng quá mức - có ý định hoặc không có ý định. Bộ lưu trữ đối tượng (Blob Store): Khối này được dùng để lưu trữ các dữ liệu phi cấu trúc, ví dụ như các tệp đa phương tiện và các tệp nhị phân. Bộ tìm kiếm phân tán (Distributed Search): Khối này là một hệ thống tìm kiếm lấy truy vấn của người dùng và trả về một nội dung liên quan trong một vài giây hoặc ít hơn.
Khối này tập trung vào 3 thành phần quan trọng: thu thập (crawl), chỉ mục hóa (index) và tìm kiếm (search). Bộ ghi log phân tán (Distributed Logging): Khối này là hệ thống cho phép các dịch vụ trong một hệ thống phân tán ghi lại sự kiện của họ một cách hiệu quả. Hệ thống sẽ được thiết kế để có khả năng mở rộng và đáng tin cậy. Bộ lập lịch công việc phân tán (Distributed Task Scheduling): Khối này là hệ thống trung gian giữa công việc và tài nguyên.
Hệ thống sẽ phân bổ tài nguyên một cách hiệu quả cho các nhiệm vụ để đáp ứng các mục tiêu cấp nhiệm vụ và cấp hệ thống, thường được sử dụng để giảm bớt xử lý nền để hoàn thành bất đồng bộ. Bộ đếm phân tán (Sharded Counters): Khối này được sử dụng để xử lý hàng triệu yêu cầu đọc/viết đồng thời, như số lượt thích trên một bài viết của người nổi tiếng trên mạng xã hội. Ví dụ về một hệ thống lớn “Youtube” Đầu tiên, xác định các yêu cầu của Youtube ● Yêu cầu về chức năng: ● Stream videos ● Upload videos ● Search videos according to titles ● Like and dislike videos ● Add comments to videos ● View thumbnails Yêu cầu về phi chức năng: ● Tính sẵn sàng cao (High availability): Đây là tính chất quan trọng của hệ thống, đòi hỏi hệ thống luôn sẵn sàng hoạt động. Hệ thống phải đảm bảo một tỷ lệ thời gian hoạt động (uptime) cao.
Thông thường, một tỷ lệ uptime từ 99% trở lên được coi là tốt. ● Khả năng mở rộng (Scalability): Để đáp ứng sự tăng trưởng về số lượng người dùng, hệ thống cần đảm bảo rằng các vấn đề như lưu trữ dữ liệu, băng thông yêu cầu cho việc xem dữ liệu đồng thời, và số lượng yêu cầu từ người dùng đồng thời không gây ra sự kẹt trệ (bottleneck) trong ứng dụng hoặc máy chủ web của chúng ta. ● Hiệu suất tốt (Good performance): Việc cung cấp trải nghiệm xem video mượt mà đóng vai trò quan trọng trong việc cải thiện tổng thể hiệu suất của hệ thống. ● Độ tin cậy (Reliability): Dữ liệu được tải lên hệ thống phải được bảo vệ và không được mất mát hoặc bị hỏng.
Điều này đảm bảo rằng thông tin quý báu của người dùng không bị ảnh hưởng bởi sự cố hoặc lỗi hệ thống. Bây giờ là các khối xây dựng (Building block) được xác định trong hệ thống Youtube Databases (Cơ sở dữ liệu): Cơ sở dữ liệu cần được sử dụng để lưu trữ thông tin về video, hình thu nhỏ, bình luận và thông tin liên quan đến người dùng.