Đây là loạt bài viết dẫn dắt các bạn tìm hiểu sâu hơn về các loại kiến trúc hệ thống để mở rộng phục vụ được nhiều người dùng đồng thời hơn với chi phí phát triển, vận hành thấp hơn

Scale up vs scale out

Scale up (mở rộng lên)
Scaleup

Scale out (mở rộng ra)
Scale out

Trong hệ thống máy tính, việc chọn giữa chiến thuật scale out và scale up phụ thuộc vào nhiều yếu tố như tính năng của ứng dụng, chi phí, yêu cầu hiệu năng, và khả năng mở rộng trong tương lai. Dưới đây là một số tình huống khi nào nên sử dụng mỗi chiến thuật:

Khi nào dùng Scale Up:

  1. Ứng dụng đòi hỏi tài nguyên lớn: Các ứng dụng yêu cầu CPU mạnh, bộ nhớ lớn, hoặc tốc độ xử lý cao có thể hưởng lợi từ việc scale up vì một máy chủ mạnh có thể đáp ứng tốt hơn.
  2. Dễ dàng quản lý: Scale up thường đơn giản hơn về mặt quản lý vì chỉ cần quản lý một máy chủ thay vì nhiều máy chủ.
  3. Chi phí ban đầu: Nếu chi phí ban đầu thấp hơn và không yêu cầu mở rộng lớn ngay lập tức, scale up có thể là lựa chọn tốt.

Khi nào dùng Scale Out:

  1. Tính mở rộng linh hoạt: Khi yêu cầu hệ thống phải mở rộng nhanh chóng và linh hoạt, scale out là lựa chọn tốt vì có thể thêm nhiều máy chủ nhỏ khi cần.
  2. Độ tin cậy và tính sẵn sàng cao: Scale out giúp tăng cường độ tin cậy và tính sẵn sàng của hệ thống vì nếu một máy chủ gặp sự cố, các máy chủ khác vẫn có thể hoạt động.
  3. Chi phí dài hạn: Về dài hạn, scale out có thể tiết kiệm chi phí hơn vì không phải đầu tư vào các máy chủ đắt tiền mà chỉ cần thêm các máy chủ nhỏ hơn khi nhu cầu tăng.
  4. Phân tán tải công việc: Các ứng dụng có khả năng chia nhỏ công việc và phân tán tải dễ dàng sẽ hưởng lợi từ scale out, chẳng hạn như các ứng dụng web, dịch vụ đám mây, hoặc cơ sở dữ liệu phân tán.

Elastic Scale

Elastic Scale
Elastic scale là khả năng của một hệ thống máy tính hoặc dịch vụ để tự động mở rộng hoặc thu hẹp tài nguyên dựa trên nhu cầu hiện tại. Điều này cho phép hệ thống đáp ứng các biến động về tải công việc mà không cần sự can thiệp thủ công, đảm bảo hiệu suất và tính sẵn sàng của dịch vụ.

Các yếu tố chính của Elastic Scale:

  1. Tự động mở rộng: Hệ thống tự động thêm tài nguyên (như máy chủ, bộ nhớ, hoặc dung lượng lưu trữ) khi nhu cầu tăng cao, ví dụ như khi số lượng người dùng tăng đột ngột.
  2. Tự động thu hẹp: Khi nhu cầu giảm, hệ thống tự động giảm bớt tài nguyên để tiết kiệm chi phí và tài nguyên.
  3. Giám sát và phản ứng: Sử dụng các công cụ giám sát để theo dõi hiệu suất hệ thống và phản ứng lại một cách động khi các ngưỡng cụ thể được vượt qua.
  4. Linh hoạt và nhanh chóng: Khả năng mở rộng và thu hẹp một cách nhanh chóng và hiệu quả, thường trong thời gian thực hoặc gần như thời gian thực.

Ứng dụng của Elastic Scale:

  • Dịch vụ đám mây: Các nhà cung cấp dịch vụ đám mây như AWS, Azure, và Google Cloud cung cấp khả năng elastic scaling để đảm bảo các ứng dụng và dịch vụ chạy trên đám mây có thể xử lý tải công việc biến động một cách hiệu quả.
  • Ứng dụng web: Các trang web thương mại điện tử, mạng xã hội, và các ứng dụng web khác thường sử dụng elastic scale để đảm bảo hiệu suất tốt trong các thời điểm cao điểm như lễ hội mua sắm hoặc sự kiện lớn.
  • Cơ sở dữ liệu: Một số hệ thống cơ sở dữ liệu có khả năng elastic scaling để xử lý các truy vấn và lưu trữ dữ liệu tăng đột ngột.

Lợi ích của Elastic Scale:

  • Tối ưu hóa chi phí: Chỉ sử dụng tài nguyên khi cần thiết, giúp giảm chi phí tổng thể.
  • Tăng hiệu suất: Đảm bảo hiệu suất cao và ổn định khi đối mặt với các biến động về tải công việc.
  • Tính sẵn sàng cao: Giảm nguy cơ dịch vụ bị gián đoạn hoặc giảm hiệu suất trong các tình huống tải công việc tăng đột ngột.

Kiến trúc Monolithic vs Distributed vs Microservice

Phân biệt giữa kiến trúc Monolithic, Distributed và Microservice là điều quan trọng để hiểu rõ ưu nhược điểm của từng loại và áp dụng chúng vào các tình huống phù hợp trong phát triển phần mềm.

Kiến trúc Monolithic:

  • Đặc điểm:
    • Toàn bộ ứng dụng được xây dựng như một khối duy nhất.
    • Tất cả các chức năng của ứng dụng (giao diện người dùng, logic nghiệp vụ, truy cập dữ liệu) đều được kết hợp chặt chẽ trong một mã nguồn duy nhất và chạy trên một tiến trình.
    • Monolithic thường đi cùng với phương pháp scale up.
  • Ưu điểm:
    • Dễ dàng phát triển ban đầu vì có ít thành phần phải quản lý.
    • Dễ dàng triển khai vì chỉ cần triển khai một đơn vị.
    • Ít chi phí cho việc thiết lập hạ tầng và công cụ.
  • Nhược điểm:
    • Khó mở rộng (scale) vì toàn bộ ứng dụng phải được mở rộng cùng nhau.
    • Khó bảo trì và nâng cấp vì sự thay đổi ở một phần có thể ảnh hưởng đến toàn bộ hệ thống.
    • Khó khăn trong việc áp dụng các công nghệ mới nếu ứng dụng đã phát triển lớn.

Với các bạn sinh viên, lập trình viên mới, dự án nhỏ, ít ngân sách, hãy luôn bắt đầu bằng kiến trúc Monolithic để đội lập trình nhỏ tập trung code nghiệp vụ, giao diện hơn là kiến trúc hệ thống phức tạp, tốn kém.
Một ứng dụng monolithic lúc ban đầu có thể triển khai trên mô hình shared hosting rất phổ biến với PHP-MySQL hoặc VPS (Virtual Private Server), cao cấp hơn là Dedicated Hosting khi cần hiệu suất cao hơn.

Monolithic

Kiến trúc Distributed:

  • Đặc điểm:
    • Ứng dụng được phân chia thành nhiều thành phần khác nhau, có thể chạy trên các máy chủ khác nhau.
    • Các thành phần giao tiếp với nhau thông qua mạng lưới (network).
    • Từng thành phần viết bằng ngôn ngữ lập trình khác nhau, thư viện khác nhau, chỉ cần tuân thủ các chuẩn giao tiếp chung là được. Distributed thường đi cùng với phương pháp scale out.
  • Ưu điểm:
    • Dễ dàng mở rộng vì các thành phần có thể được mở rộng độc lập.
    • Tăng tính sẵn sàng và độ tin cậy vì một thành phần hỏng không làm hỏng toàn bộ hệ thống.
  • Nhược điểm:
    • Phức tạp hơn trong việc phát triển và triển khai vì cần quản lý nhiều thành phần.
    • Cần phải xử lý các vấn đề liên quan đến giao tiếp mạng, đồng bộ hóa, và độ trễ.
    • Khó khăn trong việc theo dõi và gỡ lỗi hệ thống vì sự phân tán của các thành phần.
      Centralized vs Distributed

Địa đạo Củ Chi được xây và mở rộng trong nhiều năm có thể là hình ảnh rõ ràng về một hệ thống phân tán.
Địa đạo Củ Chi

Kiến trúc Microservice:

  • Đặc điểm:
    • Ứng dụng được phân chia thành các dịch vụ nhỏ, mỗi dịch vụ có một nhiệm vụ riêng biệt và độc lập. Microservice
    • Các dịch vụ giao tiếp với nhau qua giao thức nhẹ (như HTTP/REST, gRPC).
    • Mỗi dịch vụ có thể được phát triển, triển khai và mở rộng độc lập.
  • Ưu điểm:
    • Tính linh hoạt cao, cho phép các nhóm nhỏ làm việc độc lập trên các dịch vụ khác nhau.
    • Dễ dàng áp dụng công nghệ mới vào từng dịch vụ mà không ảnh hưởng đến toàn bộ hệ thống.
    • Dễ mở rộng vì các dịch vụ có thể được mở rộng độc lập dựa trên nhu cầu cụ thể.
  • Nhược điểm:
    • Tăng phức tạp trong quản lý và giám sát vì có nhiều dịch vụ nhỏ phải theo dõi.
    • Cần cơ sở hạ tầng phức tạp hơn để hỗ trợ giao tiếp và triển khai các dịch vụ.
    • Tăng chi phí do cần nhiều tài nguyên cho việc quản lý và triển khai.
      microservice