Chương 1: Tổng quan về thiết kế hệ thống Thiết kế hệ thống là quá trình định nghĩa các thành phần và cách tích hợp chúng, các giao diện lập trình ứng dụng (APIs), và mô hình dữ liệu (data model) để xây dựng các hệ thống với quy mô lớn đáp ứng các yêu cầu về chức năng và phi chức năng. Thiết kế hệ thống sử dụng các khái niệm trong lĩnh vực mạng máy tính (Computer Networking), tính toán song song (Parallel Computing) và hệ thống phân tán (Distributed systems) để xây dựng những hệ thống có khả năng mở rộng và hiệu suất cao. Thiết kế hệ thống có mục đích xây dựng những hệ thống có độ tin cậy (reliable), hiệu quả, và dễ bảo trì cùng với những đặc điểm khác. • Hệ thống hiệu quả là hệ thống đáp ứng tất cả các nhu cầu của người dùng và yêu cầu kinh doanh.
• Hệ thống đáng tin cậy là hệ thống có khả năng xử lý lỗi, sự cố và sai sót. • Hệ thống dễ bảo trì là hệ thống linh hoạt và dễ dàng mở rộng hoặc thu nhỏ. Khả năng thêm tính năng mới cũng nằm trong phạm vi của tính dễ bảo trì. Thiết kế trong các hệ thống nhỏ và trong các hệ thống lớn 1.1 Thiết kế trong hệ thống nhỏ Với các hệ thống nhỏ và tương đối đơn giản, thiết kế và kiến trúc của hệ thống không phải là một vấn đề quá phức tạp, do bản thân các hệ thống này tương đối dễ tổ chức, dễ vận hành, dễ bảo trì và nhờ đó nên không có nhiều thành phần phức tạp.
9 Với các hệ thống này, Với các hệ thống này, có rất nhiều mô hình phát triển phần mềm đủ đáp ứng yêu cầu: Kiến trúc client-server, kiến trúc layer, kiến trúc monolithic,… Hình 1: Kiến trúc Layer Hình 2: Kiến trúc monolithic 10 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 đều là mô hình hệ thống tập trung vì vậy nó sẽ có các vấn đề sau: Về mặt “hiệu suất”, các hạn chế về vật lý của phần cứng như nâng cấp CPU, nâng cấp RAM, nâng ổ cứng,… đặt ra một số giới hạn đối một máy chủ. Với các hệ thống có quy mô lớn hơn, mô hình nghiệp vụ phức tạp hơn, nhiều người sử dụng hơn, các mô hình kiến trúc kể trên không đủ khả năng để cung cấp dịch vụ kịp thời, chính xác và ổn định. Hơn nữa, việc nâng cao hiệu suất của một máy chủ duy nhất trở nên vô cùng đắt đỏ sau một ngưỡng nhất định. Về mặt “mở rộng”, việc lưu trữ và xử lý dữ liệu đều đóng góp cho các hệ thống phần mềm về những giá trị nhất định.
Vì vậy, Khi lượng khách hàng của hệ thống tăng lên, hệ thống cần 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 bao gồm một máy chủ duy nhất chỉ có thể mở rộng đến một mức nhất định. Về mặt “sẵn sàng”, Hiện nay, hầu hết các dịch vụ trực tuyến cần hoạt động liên tục (24/7), đây là một thách thức lớn đối với các hệ thống. Khi một dịch vụ khẳng định có tính “sẵn sàng” 5-9, thì thường hoạt động 99.
Điều này do giới hạn phần cứng của một server không thể nào đáp ứng được một nghìn, mười nghìn, thậm chí là cả triệu yêu cầu tại một thời điểm.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ữ. 11 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 13 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. Blob storage (Lưu trữ đối tượng lớn): Lưu trữ đối tượng lớn là một phần quan trọng để lưu trữ tất cả các video trên nền tảng.
CDN (Mạng phân phối nội dung): Mạng phân phối nội dung được sử dụng để hiệu quả phân phối nội dung đến người dùng cuối, giảm độ trễ và áp lực đối với máy chủ cuối cùng. Load balancers (Cân bằng tải): Cân bằng tải là cần thiết để phân phối hàng triệu yêu cầu từ khách hàng đến các máy chủ có sẵn trong bể máy chủ.