[Dịch bài] System Design: Khả năng mở rộng
Chạy một hệ thống cho một người dùng rất khác so với cho 10,000 người dùng, và cũng rất khác so với 1 triệu người dùng. Khi hệ thống phát triển, hiệu suất sẽ bắt đầu giảm nếu chúng ta không điều chỉnh nó để xử lý với vấn đề tăng trưởng. Một hệ thống có thể phát triển liên tục để hỗ trợ khối lượng công việc càng ngày càng tăng.
Làm thế nào để một hệ thống có thể phát triển
Một hệ thống có thể phát triển theo nhiều chiều
1. Thêm nhiều người dùng
Nhiều người dùng bắt đầu sử dụng hệ thống, dẫn tới tăng số lượng request.
Ví dụ: Một nền tảng mạng xã hội đang có lượng người dùng mới tăng đột biến
2. Thêm nhiều tính năng
Thêm nhiều tính năng mới để mở rộng khả năng của hệ thống.
Ví dụ: Một trang thương mai điện tử đang thêm phương thức hổ trợ thanh toán mới.
3. Tăng khối lượng dữ liệu
Tăng về dữ liệu mà hệ thống lưu trữ và quản lý do thao tác của người dùng hoặc hệ thống logging (ghi nhật ký).
Ví dụ: Một nền tảng steaming video như youtube lưu trữ thêm nhiều nội dụng video hơn theo thời gian.
4. Thêm độ phức tạp
Kiến trúc của hệ thống phát triển để phù hợp với các tính năng, quy mô hoặc tích hợp mới, dẫn tới các thành phần và dependencies đi theo.
Ví dụ: Một hệ thống bắt đầu là một ứng dụng đơn giản dần được chia ra các hệ thống độc lập, nhỏ hơn.
5. Thêm nhiều khả năng tiếp cận về địa lý
Hệ thống được mở rộng để phục vụ người dùng ở các khu vực hoặc quốc gia mới.
Ví dụ: Một công ty thương mại điện tử ra mắt trang web và phân phối tại các thị trường quốc tế mới.
Làm sao để mở rộng hệ thống
Dưới đây là 10 cách phổ biến để tạo ra một hệ thống có thể mở rộng.
1. Mở rộng theo chiều dọc (scale up)
Điều này có nghĩa là thêm nhiều năng lượng vào máy hiện tại để nâng cấp server với nhiều RAM, CPU nhanh hơn, hoặc nhiều dung lượng hơn. Đó là một cách tiếp cận tốt cho một hệ thống kiến trúc đơn giản nhưng sẽ giới hạn về hệ thống có thể phát triển tới đâu. Giống như việc cứ thêm 1 tính năng, hay thêm vài chục khách hàng thì lại phải mua thêm phần cứng để đắp vào server.
2. Mở rộng theo chiều ngang (scale out)
Điều này có nghĩa thêm nhiều máy chủ vào hệ thống của bạn để phân tán khối lượng công việc trên nhiều máy chủ. Nó thường được coi là cách hiệu quả nhất để mở rộng quy mô cho các hệ thống lớn. Ví dụ: Netflix sử dụng mở rộng theo chiều ngang cho dịch vụ streaming, thêm nhiều server vào cluster của họ để xử lý số lượng người dùng và lưu lượng dữ liệu ngày càng tăng.
3. Cân bằng tải (Load Balancing)
Cân bằng tải là một tiến trình để phân phối lương lượng truy cập để nhiều máy chủ để đảm bảo không có một server riêng biệt nào bị overwhelmed (quá tải). Ví dụ: Google sử dụng cân bằng tải rộng rãi trên cơ sở hạ tầng toàn cầu của mình để phân phối các queries (truy vấn) tìm kiếm và lưu lượng truy cập một đồng đều trên các server farm của mình.
4. Bộ nhớ đệm (Caching)
Lưu trữ những dữ liệu thường xuyên được truy cập vào trong bộ nhớ (giống như RAM) để giảm mức độ tải của server hoặc database. Triển khai bộ nhớ đệm có thể cải thiện đáng kể thời gian phản hồi. Ví dụ: Reddit sử dụng caching để lưu trữ những nội dụng thường xuyên được truy cập như bài viết hot và bình luận, nên hệ thống của họ có thể phục vụ rất nhanh mà không cần query (truy vấn) tới database mỗi lần.
5. Content Delivery Networks - Mạng phân phối nội dụng (CDNs)
Phân phối những assets (hình ảnh, video, vv.) tĩnh tới gần người dùng. Điều này có thể giảm đáng để độ trễ và dẫn đến thời gian tải nhanh hơn. Ví dụ: Cloudlare cung cấp dịch vụ CDN, tăng tốc độ tủy cập website của người dùng bằng cách lưu trữ nội dung vào bộ nhớ đệm trong các máy chủ đặt gần người dùng.
6. Phân vùng (Partitioning)
Chia nhỏ dữ liệu hoặc functionality lên nhiều nodes/ server để phân phối workload (khối lượng công việc) và trách bottlenecks (nghẽn cổ chai) Ví dụ: Amazon DynamoDB sử dụng phân vùng để phân phối dữ liệu và lượng truy cập cho dịch vụ NoSQL database để tiếp cận nhiều server, đảm bộ hiệu suất và khả năng mở rộng nhanh chóng.
7. Giao tiếp bất đồng bộ (Asynchronous communication)
Trĩ hoãn các tác dụng long-running (chạy dài) hoặc non-critical (không quan trọng) cho background queues hoặc message brokers. Điều này đảm bảo ứng dụng chính của bạn vẫn đáp ứng được người dùng. Ví dụ: Slack sử dụng giao tiếp bất đồng bộ để nhắn tin. Khi moọt tin nhắn được gửi đi, giao diện của người gửi không bị freeze (treo); nó vẫn tiếp tục phản hồi trong khi tin nhắn được xử lý và gửi ở background.
8. Kiến trục Dịch vụ Nhỏ (Microservices Architecture)
Chia ứng dụng của bạn thành các nhóm dịch vụ nhỏ hơn, độc lập và có thể mở rộng quy mô một cách độc lập. Điều này cải thiện khả năng phục hồi và cho phép team làm việc trên từng component cụ thể trong parallel. Ví dụ: Uber đã phát triển kiến trúc của mình thành các microservices để xử ly những chức năng khác nhau như thanh toán, thông báo và kết nối chuyến đi một cách độc lập, cho phép mở rộng quy mô hiệu quả và phát triển nhanh chóng.
9. Tự động mở rộng (Auto-Scaling)
Tự động điều chỉnh số lượng server hoạt động dựa trên lượng tải hiện tại của hệ thống. Điều này giúp đảm bảo hệ thống có thể xử lý lưu lượng truy cập tăng đột biến mà không cần can thiệp thủ công. Ví dụ: Ứng dụng giám sát AWS Auto Scaling và tự động điều chỉnh công suất để duy trì hiệu suất ổn định, có thể dự đoán được ở mức chi phí thấp nhất có thể.
10. Triển khai đa vùng (Multi-region Deployment)
Triển khai ở dụng ở nhiều trung tâm dữ liệu (data center) hoặc cloud regions để giảm độ trễ và cải thiện khả năng dự phòng.
Ví dụ: Spotify sử dụng Triển khai đa vùng để đảm bảo dịch vụ music streaming luôn có sẵn và phản hồi tới tất cả người sử dụng trên thế giới, bất kể họ ở đâu.
Dịch từ "https://newsletter.ashishps.com/p/scalability" : Tác giả ASHISH PRATAP SINGH
All Rights Reserved