© 2020, Developed by Hieu Dev

Sử dụng Distributed Caching trong .NET Core

Trong bài viết này, chúng ta sẽ tìm hiểu về Distributed Caching là gì và cách triển khai distributed caching trong .NET Core.

Sử dụng Distributed Caching trong .NET Core

Distributed Caching là gì?

Distributed Caching là một cơ chế duy trì bộ nhớ cache như một dịch vụ mà nhiều app servers có thể sử dụng. Ta có thể thấy được nó khác với In-Memory Caching, trong đó ta lưu dữ liệu vào bộ nhớ của server. Distributed Caching có thể cải thiện đáng kể hiệu suất và khả năng mở rộng của ứng dụng và là một lựa chọn tuyệt vời khi lưu trữ ứng dụng trên nhiều máy chủ hoặc trên cloud.

.NET Core hỗ trợ các kiểu triển khai distributed caching khác nhau và rất dễ dàng thay đổi việc triển khai sau này chỉ bằng cách thay đổi cấu hình. Bất kể cách triển khai nào, để làm việc với distributed caching, ta sẽ sử dụng interface IDistributedCache.

Ngoài ra, ta còn có thể mở rộng được (scalability). Ví dụ khi ta triển khai mô hình microservices, và muốn caching dữ liệu lại trên mỗi cluster, như thế, ta có thể dễ dàng mở rộng các dung lượng size hoặc gắn thêm nhiều node mới cho service caching. Khắc phục được hạn chế dung lương của memory cache.

Các dịch vụ Distributed Caching 

Bây giờ, mình sẽ giới thiệu các dịch vụ distributed caching khác nhau mà .NET Core hỗ trợ:

Distributed Memory Cache

Đây là cách triển khai đơn giản nhất để lưu trữ dữ liệu trong bộ nhớ của app server. Mặc dù đây không phải là bộ nhớ cache phân tán thực sự, nhưng nó là một lựa chọn tuyệt vời cho việc phát triển và thử nghiệm logic bộ nhớ cache của ứng dụng. 

Một tình huống khác hữu ích là khi muốn bắt đầu với một máy chủ duy nhất trong quá trình sản xuất, nhưng nó cần có sự linh hoạt để mở rộng ra nhiều máy chủ trong tương lai. 

SQL Server Cache

Việc triển khai SQL Server Cache được implement từ IDistributedCache được lưu trữ trong SQL server database. Chúng ta có thể sử dụng sql-cache để định cấu hình cơ sở dữ liệu SQL Server để hỗ trợ Distributed Caching. Bằng cách sử dụng lệnh sql-cache create, chúng ta có thể tạo một bảng để lưu trữ các cache item.

Ta cần cài đặt NuGet Package Microsoft.Extensions.Caching.SqlServer. Sau đó, ta cần update các connection string, schema, và table names trong class Program.

Distributed Redis Cache

Redis (Remote Dictionary Server) là một database open-source in-memory, cái mà thường xuyên được sử dụng như một distributed cache.

Về mặt cơ bản thì nó là một dạng key-value (key là khóa để bạn có thể truy vấn và nó là duy nhất, value là dữ liệu bạn lưu trữ với datatype tương ứng ở trên). 

Có 2 cách cài đặt redis trên local đó là:
  • Cài đặt Redis Server, bạn download trên trang chủ và cài đặt bình thường với hệ điều hành tương ứng. Sau khi download về thì bạn chạy redis-server.exe đây chính là cache service mà bạn sử dụng làm server lưu trữ tập trung cache data của bạn. 
  • Cách thứ 2 là dùng docker, vì cách đầu tiên mình không nghĩ nó hữu dụng khi deploy do luôn phải đảm bảo nó running và không thể tắt bật tắt bật nếu không muốn dữ liệu của bạn bị mất. 

Sau cùng, ta cần phải thêm Nuget Package Microsoft.Extensions.Caching.StackExchangeRedis và cung cấp chuỗi kết nối Redis và instance name.


NCache Cache 

NCache là một open-source caching phổ biến khác được phát triển hoàn toàn trong .NET. Ta có thể cấu hình nó ở local hoặc dưới dạng distributed cluster.

Để cấu hình NCache, trước tiên, chúng ta phải cài đặt NCache NuGet. Sau đó, chúng ta cần tạo tệp cấu hình client và chỉ định cấu hình. Sau đó, chúng ta có thể gọi phương thức AddNCacheDistributedCache() trong class Program để thêm NCache.

Ưu điểm của Caching

Bây giờ chúng ta sẽ chỉ ra các ưu điểm khi sử dụng distributed caching như sau:

Hiệu năng (Performance)

Không thể phủ nhận là khi sử dụng cache, phần hiệu năng cho end user được tăng lên một cách rõ rệt. Trải nghiệm tuyệt vời hơn hẳn. Ngoài ra distributed caching còn giữ nguyên tất cả các lợi ích của In-memory caching như: giảm thiểu connection tới database, tăng tốc độ xử lý, cải thiện hiệu suất…

Giả sử, mỗi giây sẽ bạn nhận được 100 request, mỗi request sẽ mất 1s để chờ database query xử lý. Database sẽ dễ bị quá tải, người dùng thì chờ rất lâu.

Trong đó, khi sử dụng caching để cache kết quả query vào RAM, lúc này thời gian tuy xuất chỉ còn tầm 50-100ms, lại không phải cần truy cập database. Hệ thống được giảm tải, còn người dùng lại nhận được kết quả nhanh hơn rất nhiều nhiều.

Mở rộng (Scalability)

Ta thấy một service riêng biệt có thể gỡ bỏ hoặc thêm mới vào mà không ảnh hưởng đến cache service. Không những đáp ứng được về khả năng mở rộng, Distributed cache còn có thể mở rộng nhanh chóng, không ảnh hưởng về mặt tính năng

Sẵn sàng (Availability)

Khi sử dụng cache, nó giúp ta về tính sẵn sàng cho toàn hệ thống. Dữ liệu trong cache vẫn tồn tại khi bất kỳ service restart và deployments. 

Trong hệ thống, khi thấy một hàm chạy lâu, tốn nhiều tài nguyên, đôi khi chỉ cần implement caching cho hàm đó là hệ thống đã chạy nhanh ngay, không ảnh hưởng đến các thành phần khác của hệ thống.

Lời kết

Quyết định về việc triển khai IDistributedCache sẽ sử dụng trong các ứng dụng khác nhau tùy thuộc vào một số yếu tố khác nhau. Sự lựa chọn giữa Redis và SQL nên được thực hiện dựa trên cơ sở hạ tầng nào có sẵn cho bạn, yêu cầu hiệu suất của bạn và kinh nghiệm của nhóm phát triển. 

Việc triển khai SQL vẫn là một giải pháp tốt, nhưng cần nhớ rằng việc khôi phục dữ liệu sẽ không mang lại hiệu suất tuyệt vời, vì vậy dữ liệu được lưu vào bộ nhớ cache nên được lựa chọn cẩn thận.

Caching là một kĩ thuật giúp tăng tốc độ xử lý. Kĩ thuật này đơn giản, dễ implement mà lại vô cùng hiệu quả nên được sử dụng trong rất nhiều hệ thống.

Hầu hết các loại dịch vụ caching phụ thuộc vào lưu trữ trong bộ nhớ để truy xuất dữ liệu nhanh chóng. Bộ nhớ là một tài nguyên có hạn và đắt tiền, chúng ta chỉ nên lưu vào bộ nhớ cache những dữ liệu thực sự cần thiết.

Nguồn tham khảo, các bạn có thể tìm hiểu chi tiết qua link dưới đây:
https://docs.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-6.0

Sắp tới, mình sẽ hướng dẫn các bước thực hiện kỹ thuật này một cách chi tiết.

Mong bài viết hữu ích, chúc các bạn thành công!
Hieu Ho.

Đăng nhận xét

Mới hơn Cũ hơn

TOGETHER

WE GROW