I. Khái niệm
Ứng dụng có thể mở rộng (scalable application) nói đến những ứng dụng có khả năng xử lý được số lượng tăng dần về lượt tải, người dùng, dữ liệu hoặc các tài nguyên khác mà hiệu suất hoặc độ tin cậy không bị giảm đáng kể.
Việc xây dựng một ứng dụng có thể mở rộng là hết sức quan trọng để tằng cường trải nghiệm người dùng và giảm các nguy cơ về mất dữ liệu, các vấn đề hiệu suất tiêu cực ảnh hưởng đến hoạt động kinh doanh của doanh nghiệp.
II . Cách phát triển ứng dụng có thể mở rộng
1. Khả Năng Mở Rộng Cơ Sở Dữ Liệu
Cơ sở dữ liệu luôn là một thành phần không thể thiếu trong một ứng dụng, Vì thế để đáp ứng được khả năng mở rộng của ứng dụng cũng cần đảm bảo khả năng mở rộng của cơ sở dữ liệu. Trong thực tế chúng ta có thể sử dụng các dịch vụ cloud trong đó các nhà cung cấp sẽ cung cấp sẵn các cơ chế chịu tải cho cơ sở dữ liệu. Ví dụ: AWS Aurora, Planetscale, Mongo Cloud….
2. Cân Bằng Tải
Sử dụng cân bằng tải để phân phối lưu lượng truy cập đến nhiều phiên bản (Nodes) của ứng dụng. Điều này ngăn chặn bất kỳ phiên bản nào trở thành nút thắt cổ chai, đảm bảo tính khả dụng và độ phản hồi cao. Có thể sử dụng kết hợp các hệ thống tự động cân bằng tải nhắm mục đích tiết kiệm tài nguyên khi lượng truy cập chưa quá nhiều.
Ví dụ: Elastic Load Balancing, Azure Load Balancer, Kubernetes…
3. Xử Lý Files
Trong các ứng dụng một số tác vụ sẽ cần phải xử lý với files. Cần lưu ý: Không được lưu files trược tiếp tại server vì khi thực hiện scale các node của ứng dụng sẽ xảy ra tình trạng files được lưu ở nhiều nodes khác nhau không thể kiểm soát.
Giải pháp: Cần triển khai một ứng dụng lưu trữ tập tin riêng biệt hoặc sử dụng dịch vụ lưu trữ (ví dụ: AWS S3 hoặc tương tự) để xử lý các tập tin do người dùng tải lên. Cách tiếp cận này không chỉ mở rộng tốt hơn mà còn giúp giảm tải lưu trữ từ máy chủ ứng dụng chính.
4. Lưu trữ thông tin trong Memory
Tránh phụ thuộc vào lưu trữ dữ liệu trong Memory trong quá trình ứng dụng chạy. Trên thực tế khi các ứng dụng triển khai ở nhiều nodes khác nhau, mỗi node sẽ có 1 Memory riêng biệt, nếu sử dụng Memory lưu trữ các giá trị và sử dụng có thể gây sai lệch dữ liệu khi triển khai nhiều nodes.
Giải pháp: Sử dụng cơ sở dữ liệu hoặc bộ nhớ đệm phân tán (ví dụ: Redis) để lưu trữ dữ liệu tập trung, đảm bảo độ tin cậy và khả năng mở rộng.
5. Quản lý session
Quản lý Session người dùng là việc không thể thiếu của ứng dụng. Có 2 cách quản lý session phổ biến hiện nay bao gồm: Token base và Session – Cookie
Nếu sử dụng Session – Cookie để quản lý phiên của người dùng thì bạn cần lưu ý khi triển khai ứng dụng trên nhiều nodes cần cấp hình session sử dụng cơ sở dữ liệu hoặc bên thứ 3 để lưu trữ tập trung (Ví dụ: Redis hoặc tương tự) bời vì mặc định session sẽ được lưu trữ trên Memory/Files. Việc này gây ra tình trạng không tìm thấy dữ liệu của session khi triển khai nhiều nodes. Ngoài ra có thể sử dụng cơ chế cân bằng tải theo session mỗi session sẽ được chuyển hướng tới 1 node cố định
6. Scheduler
Scheduler đây là các tác vụ chạy ngầm theo lịch trình để xử lý một số công việc nhất định (Ví dụ: Dọn dẹp các files tải lên, đánh dấu người dùng spam…). Với các tác vụ này khi triển khai nhiều nodes chúng ta cần đảm bảo rằng chỉ duy nhất 1 node được chạy tránh tính trạng chạy tác vụ nhiều lần ở trên các nodes khác nhau.
Giải Pháp: Sử dụng các hệ thống hàng đợi tác vụ phân tán (ví dụ: Redis, RabbitMQ) để quản lý việc xử lý tác vụ. Những hệ thống này có thể giúp đảm bảo rằng các tác vụ chỉ được một công nhân thực hiện tại một thời điểm. Ngoài ra có thể sử dụng giải pháp đơn giản hơn tách biệt phần Scheduler ra khỏi ứng dụng chính có thể triển khai riêng 1 ứng dụng để chạy Scheduler hoặc sử dụng các dịch vụ khác như serverless jobs để thực hiện tác vụ hoặc call API tới ứng dụng chính.