Một lời về khả năng mở rộng
Khả năng mở rộng thường được sử dụng như một “câu thần chú” để ám chỉ rằng một hệ thống nào đó được thiết kế kém hoặc đang gặp sự cố. Trong các cuộc thảo luận, bạn thường nghe thấy câu: “nhưng cái đó không thể mở rộng được” như một cách kết thúc cuộc tranh luận. Đây thường là dấu hiệu cho thấy các lập trình viên đang gặp phải giới hạn do kiến trúc hệ thống không cho phép dịch vụ phát triển thêm. Khi “khả năng mở rộng” được dùng theo nghĩa tích cực, nó thường chỉ một đặc điểm mong muốn, ví dụ như: “nền tảng của chúng ta cần khả năng mở rộng tốt”.
Vậy chúng ta thực sự muốn nói gì khi nhắc đến khả năng mở rộng? Một dịch vụ được xem là có khả năng mở rộng nếu khi tăng tài nguyên trong hệ thống, hiệu năng của hệ thống cũng tăng lên theo tỷ lệ tương ứng. Tăng hiệu năng nhìn chung có nghĩa là xử lý được nhiều đơn vị công việc hơn, nhưng cũng có thể là xử lý các đơn vị lớn hơn — chẳng hạn như khi dữ liệu tăng lên.
Trong các hệ thống phân tán, còn có những lý do khác để bổ sung tài nguyên, ví dụ như nhằm tăng độ tin cậy của dịch vụ. Việc thêm tính dư thừa là tuyến phòng thủ đầu tiên quan trọng trước các sự cố. Một dịch vụ luôn sẵn sàng được coi là có khả năng mở rộng nếu việc thêm tài nguyên để phục vụ cho tính dư thừa không làm giảm hiệu năng của hệ thống.
Tại sao khả năng mở rộng lại khó? Bởi vì nó không thể là một điều nghĩ đến sau cùng. Các ứng dụng và nền tảng cần được thiết kế với mục tiêu mở rộng ngay từ đầu, sao cho việc bổ sung tài nguyên thực sự giúp tăng hiệu năng, hoặc khi thêm tính dư thừa thì hệ thống vẫn không bị ảnh hưởng tiêu cực. Nhiều thuật toán hoạt động tốt khi tải thấp và dữ liệu nhỏ có thể trở nên cực kỳ tốn kém khi số lượng yêu cầu tăng lên, dữ liệu lớn hơn, hoặc số lượng nút trong hệ thống phân tán tăng lên.
Một vấn đề lớn khác là khi mở rộng hệ thống theo chiều ngang (scale-out), hệ thống phải đối mặt với tính không đồng nhất. Tài nguyên trong hệ thống trở nên đa dạng hơn khi thế hệ phần cứng mới được đưa vào sử dụng, khi tài nguyên lớn hơn hoặc mạnh hơn trở nên tiết kiệm chi phí hơn, hoặc khi một số tài nguyên được đặt ở vị trí xa hơn. Tính không đồng nhất có nghĩa là một số nút trong hệ thống sẽ xử lý nhanh hơn hoặc lưu trữ được nhiều dữ liệu hơn những nút khác, và các thuật toán vốn dựa trên sự đồng nhất có thể bị phá vỡ trong tình huống này hoặc không tận dụng được các tài nguyên mới.
Vậy có thể đạt được khả năng mở rộng tốt không? Hoàn toàn có thể — nhưng chỉ khi chúng ta thiết kế và xây dựng hệ thống với khả năng mở rộng là yếu tố cốt lõi. Với các hệ thống mà chúng ta phát triển, cần phân tích cẩn thận theo trục nào hệ thống sẽ phát triển, vị trí nào cần thêm tính dư thừa, và làm thế nào để xử lý sự không đồng nhất trong hệ thống. Đồng thời cần đảm bảo rằng các kiến trúc sư hiểu rõ những công cụ nào có thể sử dụng trong từng điều kiện cụ thể và đâu là những cạm bẫy thường gặp.
Bản gốc.
https://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html