+3

Tìm hiểu về Cache trong kiến trúc phần mềm

Cache không phải là một khái niệm mới mẻ, ngay cả đối với những người dùng internet. Chắc hẳn bạn đã nghe đến việc xóa dữ liệu cache của trình duyệt khi gặp một số lỗi hoặc chỉ đơn giản là muốn xóa gợi ý web hay truy cập? Trong các hệ thống IT và phần mềm, khái niệm cache còn phổ biến hơn nữa, chúng được ứng dụng trong gần như tất cả các thành phần bao gồm cả phần cứng và phần mềm. Chúng ta có thể nghe đến cache DNS, cache IP, cache browser, cache HTTP resource... Vậy Cache là gì?

Cache là gì?

Khái niệm Cache nói đến việc lưu trữ dữ liệu vào bộ nhớ đệm hoặc khu vực lưu trữ tạm thời, giúp cho thời gian truy vấn dữ liệu đó nhanh hơn, từ đó tăng hiệu năng và sự ổn định của hệ thống. Ví dụ trên mô tả việc dữ liệu gốc được lưu trong database, và thay vì đọc trực tiếp và liên tục từ database thì việc truy vấn từ dữ liệu cache ngay trên thiết bị hoặc trình duyệt sẽ cải thiện đáng kể performance. Cache sẽ giải quyết được các vấn đề về performance thông qua các strategy:

  • 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

Chúng ta cùng quan sát một luồng request dữ liệu cơ bản từ client đi tới server và tới database:

Một request cơ bản sẽ đi từ Client qua internet tới Server và tới Database, sau đó dữ liệu truy vấn sẽ được trả về. Query DB hoặc read dữ liệu từ các ổ lưu trữ là những action ảnh hưởng nhiều đến performance của hệ thống, các action này có thể gây ra nghẽn cổ chai khi có quá nhiều request. Thực tế trên đường đi của request, ta có thể đặt rất nhiều vị trí cache hoặc các giải pháp cache khác nhau để tối ưu performance.

Client Cache Client Cache là layer cache ngay trên thiết bị đang chạy ứng dụng, có thể là trình duyệt web hoặc thiết bị mobile. Các client này đều hỗ trợ các API cho việc truy cập lưu trữ và truy vấn dữ liệu ngay trên thiết bị. Một số hình thức cache trên client:

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 Server Cache được ứng dụng khá phổ biến và có ưu điểm là có thể khai đa dạng các hình thức cache khác nhau. Các giải pháp cache phía server giúp luồng quản lý dữ liệu được tập trung. Việc refresh cache cũng sẽ dễ dàng hơn so với việc cache dữ liệu ở phía client. 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 Có thể nhiều developer đã thực hiện những kĩ thuật này mà không nghĩ rằng chúng cũng thuộc phạm vi của cache dữ liệu. Hãy nhớ rằng cache là việc chúng ta lưu trữ dữ liệu vào các khu vực lưu trữ tạm thời nhằm tăng  tốc độ truy vấn/lấy dữ liệu.

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 Trên thực tế người ta còn có thể gắn thành phần cache trước cả khi request tới server gốc. Việc này thường được thực hiện dựa trên đường đi của request tới internet. Những giải pháp này dều theo hướng hạn chế request tới server gốc, mà thực hiện cache trên các thành phần của network như proxy hay gateway. Có một giải pháp nữa cũng khá phổ biến và cũng được coi là một giải pháp cache, đó là CDN.

Content Delivery Network

CDN hoạt động dựa trên nguyên lý: Thay vì Client request trực tiếp tới server gốc (origin server), thì client sẽ request tới server có location gần mình nhất (edge server - PoPs). Nguyên lý này rất lý tưởng cho các website chứa các static content. Việc phân phối nội dung giữa origin server tới edge server có thể thông qua mô hình pull hoặc push, khi đó dữ liệu có thể chủ động phân phối tới các edge server ngay lập tức (push) hoặc khi client request tới edge server mà không có dữ liệu, lúc này edge server mới đi lấy dữ liệu, cache lại và trả về cho client.

Xem thêm về CDN: https://sunteco.vn/cdnetworks-cloud-security/

Một số vấn đề lưu ý khi sử dụng cache Giải pháp cache sẽ thích hợp với các phần dữ liệu được sử dụng để đọc nhiều hơn ghi hoặc với các dữ liệu ít thay đổi. Khi cache lại giá trị của dữ liệu, đồng nghĩa với việc nhà phát triển phải quản lý quan hệ giữa dữ liệu cache và dữ liệu gốc. Dưới đây là một số vấn đề thường gặp khi làm việc với 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.

Kết Qua những phân tích về khái niệm cache là gì? các layer cache trong kiến trúc phần mềm và những lưu ý khi áp dụng, có thể thấy rõ rằng cache là một thành phần không thể thiếu để tối ưu hóa hiệu suất hệ thống. Việc lựa chọn đúng giải pháp cache không chỉ giúp nâng cao tốc độ xử lý mà còn mang đến trải nghiệm liền mạch cho người dùng, đảm bảo hệ thống vận hành ổn định và hiệu quả. Hi vọng rằng qua bài viết này, các bạn đã nắm vững kiến thức cơ bản và có thêm góc nhìn sâu sắc hơn để triển khai các giải pháp caching một cách tối ưu nhất.

Nguồn mình tham khảo https://sunteco.vn/cache-la-gi-cache-trong-kien-truc-phan-mem/


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.