Cache là gì?
- Rút ngắn khoảng cách: vd truy vấn trên client nhanh hơn so với trên server
- Gia tăng hiệu năng truy vấn: vd truy vấn dữ liệu trên RAM sẽ nhanh hơn dữ liệu trên database hoặc ổ lưu trữ
- Preprocess: Tối ưu cho truy vấn trước khi truy vấn được thực hiện (vd gắn index, tạo view cho database.
Cache tăng hiệu năng hệ thống nói chung thông qua việc tăng tốc độ truy vấn từ phía client và giảm tải cho phía server.
Các layer cache trong kiến trúc hệ thống
Client Cache
- Runtime Variable: Đơn giản nhất người dùng có thể request một lần và lưu trữ dữ liệu trên các biến của ứng dụng để sau đó sử dụng lại
- Local storage: Dữ liệu được lưu trữ dưới dạng các vùng nhớ lưu trữ đơn giản, thường là key-value. Ví dụ: Local storage của trình duyệt
- Local Database: Trình duyệt và ứng dụng mobile đều hỗ trợ các API để làm việc với DB đơn giản ngay trên thiết bị, ngay cả với các tập dữ liệu tương đối lớn, người dùng có thể kết hợp bộ nhớ lưu trữ trên thiết bị kết hợp với các Database engine trên local device. Ví dụ IndexedDB trên web browser hoặc H2/SqlLite trên các thiết bị di động
Server Cache
- Runtime Variable/Environment: Các dữ liệu thường xuyên sử dụng như các biến về giá trị hay cấu hình cần cho ứng dụng vận hành được lưu trữ trong các biến của ứng dụng hoặc các biến môi trường của server đang chạy.
- Server File System: Người dùng có thể truy cập đến File System để lấy ra dữ liệu đã cache từ trước mà không cần tính toán/tải lại.
- Ứng dụng cache bên thứ ba: Các ứng dụng này thường tận dụng performance in memory của RAM, kết hợp với công nghệ xử lý/lưu trữ đặc thù, không những đáp ứng nhu cầu cache mà còn cung cấp các tính năng nâng cao như HA và Distributed. Các ứng dụng này đáp ứng nhu cầu cache đa dạng và có thể tích hợp vào nhiều hệ thống cũng như công nghệ khác nhau. Các công nghệ cache phổ biến như Redis, Memcache hay S3.
Database Cache
- Database View: Các hệ cơ sở dữ liệu quan hệ (RDBMS) đều cung cấp tính năng view hay còn gọi là virtual table. View là sự trình bày dữ liệu được trích xuất sẵn từ các bảng dữ liệu gốc mà người dùng cài đặt. Việc sử dụng View khiến dữ liệu luôn sẵn sàng khi truy vấn mà người dùng không cần thực hiện thao tác join các bảng dữ liệu.
- Indexing: Phía dưới thao tác Set index cho các trường dữ liệu là việc cơ sở dữ liệu đã gắn chỉ mục cho dữ liệu thông qua các giải thuật. Việc này cũng tiêu tốn thêm bộ nhớ, nhưng ngược lại cũng tối đa được tốc độ truy vấn đến các dữ liệu có gắn index
- Preprocess: Tính toán dữ liệu từ trước là việc người dùng sử dụng các schedule function, từ đó định kì làm mới hoặc thực hiện tính toán ra các dữ liệu cần thiết từ dữ liệu hiện có, việc này đưa đến kết quả tương tự database view, nhưng không yêu cầu sự ràng buộc từ các dữ liệu thành phần. Người dùng có thể chủ động trong việc giới hạn độ mới của dữ liệu cũng như nguồn các dữ liệu thành phần.
Other cache
Content Delivery Network
Một số vấn đề lưu ý khi sử dụng cache
- Cache expiration (Hết hạn bộ nhớ đệm): Với nhiều giải pháp cache như ở trên đã trình bày, chúng ta sẽ lựa chọn giải pháp nào để đáp ứng vấn đề “Thời gian hết hạn của cache”. Thời gian lưu trữ của cache quá dài, dữ liệu có thể trở nên quá cũ, không sử dụng được, còn quá ngắn thì hệ thống cache sẽ không đủ tốt. Hay cơ chế nào để có thể refresh một phần hoặc toàn bộ dữ liệu cache.
- Cold start problem: Khi bộ nhớ cache vừa được bật lên, dữ liệu của cache là rỗng, nó cần được load dữ liệu từ nguồn (database…), lượng truy cập tới database tăng đột biến có thể dẫn đến database bị treo. Hoặc trường hợp dữ liệu chưa được đồng bộ hết tới cache, các request có thể không nhận được dữ liệu, do thời gian warm up lâu.
- Cache Capacity (Dung lượng bộ nhớ đệm): Dữ liệu luôn có xu hướng giãn ra theo thời gian, nhà phát triển cần có cơ chế quản lý/cảnh báo về lượng dữ liệu lưu trên cache, việc này sẽ đảm bảo thành phần cache luôn hoạt động ổn định.
- Store Sensitive Data (Lưu trữ dữ liệu nhạy cảm) : Lưu trữ những dữ liệu nhạy cảm của người dùng(ví dụ token, user session) trên cache có thể tiềm ẩn nguy cơ mất an toàn thông tin cho hệ thống.
- HA và Distributed (HA và Phân phối): Các hệ thống Enterprise đòi hỏi giải pháp cache có khả năng chịu tải lớn, độ sẵn sàng cao và có thể horizontal scale. Việc này cần được cân nhắc kĩ trong giai đoạn thiết kế hệ thống.