10 thủ thuật để tăng tốc độ ứng dụng .NET Core 3.x
Tốc độ cực kỳ quan trọng và nó là một nhân tố chính cho sự thành công của bất cứ ứng dụng web bào. ASP.NET Core 3 cung cấp một số các cải tiến để thu hồi bộ nhớ sử dụng và tối ưu nó. Trong bài viết này mình sẽ đưa ra 10 mẹo để giúp bạn tăng tốc ứng dụng ASP.NET Core 3 bằng cách làm những việc sau đây:
- Tránh gọi đồng bộ mà nên sử dụng bất đồng bộ
- Tối ưu hóa việc truy cập dữ liệu
- Sử dụng các kỹ thuật caching
- Sử dụng response caching middleware
- Sử dụng thư viện làm việc với JSON mới
- Giảm lượng HTTP request
- Sử dụng exception khi thật cần thiết
- Nén dung lượng response
- Tối ưu việc sử dụng HttpContext
- Tối ưu phía client
Tránh gọi đồng bộ mà nên sử dụng bất đồng bộ
Cố gắng tránh các lệnh gói đồng bộ (synchronous) khi phát triển ứng dụng ASP.NET Core 3. Lệnh gọi đồng bộ sẽ block các lệnh thực hiện sau nó cho đến khi nó xử lý xong. Khi lấy dữ liệu từ API hoặc thực hiện một tác vụ như là I/O (input/output) tốn thời gian thì nên xử lý nó theo cách bất đồng bộ.
Tránh dùng Task.Wait và Task.Result, và nên sử dụng từ khóa await. Đoạn code sau là ví dụ.
public class WebHost
{
public virtual async Task StartAsync(CancellationToken cancellationToken = default)
{
// Fire IHostedService.Start
await _hostedServiceExecutor.StartAsync(cancellationToken).ConfigureAwait(false);
// More setup
await Server.StartAsync(hostingApp, cancellationToken).ConfigureAwait(false);
// Fire IApplicationLifetime.Started
_applicationLifetime?.NotifyStarted();
// Remaining setup
}
}
Entity Framework 3.0 Core cũng cung cấp các extension method dạng async cho LINQ, để thực thi query và lấy kết quả.
Truy vấn bất đồng bộ
Truy vấn bất đồng bộ tránh việc bị block một thread trong khi thực thi câu lệnh vào database. Truy vấn bất đồng bộ thì ưu tiên nhanh để có trải nghiệm người dùng tốt.
Ví dụ:
- ToListAsync()
- ToArrayAsync()
- SingleAsync()
public async Task<List> GetBlogsAsync()
{
using (var context = new BloggingContext())
{
return await context.Blogs.ToListAsync();
}
}
Lưu dữ liệu bất đồng bộ
Lưu dữ liệu bất đồng bộ tránh việc block thread khi các thay đổi được lưu vào database. EF Core cung cấp phương thức DbContext.SaveChangesAsync() như một lệnh lưu thay vì DbContext.SaveChanges()
public static async Task AddBlogAsync(string url)
{
using (var context = new BloggingContext())
{
var blogContent = new BlogContent { Url = url };
context.Blogs.Add(blogContent);
await context.SaveChangesAsync();
}
}
Tối ưu hóa việc truy cập dữ liệu
Tăng hiệu năng cho ứng dụng bằng việc tối ưu hóa việc truy cập dữ liệu. Hầu hết ứng dụng đều phụ thuộc cơ sở dữ liệu. Chúng phải lấy dữ liệu ra, xử lý sau đó hiển thị. Nếu nó chiếm nhiều thời gian, ứng dụng sẽ phải tốn thêm time để chạy.
Đề xuất:
- Truy cập toàn bộ bằng lệnh gọi bất đồng bộ
- Chỉ lấy những gì cần thiết.
- Nên sử dụng no-tracking queries trong Entity Framework Core khi lấy ra chỉ với mục đích read-only.
- Sử dụng câu lệnh lọc và tổ hợp trong LINQ (với .Where, .Select, hay .Sum), đảm bảo rằng nó được thực thi trong database.
Bạn có thể tìm thấy các best practice trong tính năng mới của EF Core 3.0
Sử dụng các kỹ thuật caching
Tăng tốc độ của ứng dụng bằng việc giảm số lần request đến server. Tránh gọi liên tục và thay vào đó là cache các dữ liệu thường xuyên gọi nhưng ít thay đổi. Lưu lại cho các request sau này và sử dụng chúng để trả về.
Có một số các kỹ thuật cache:
- In-memory caching (cache dữ liệu trong bộ nhớ máy chủ web)
- Distributed cache. (cache bằng việc lưu dữ liệu cache bên ngoài hệ thống ví dụ Redis là 1 trong số loại này)
- Cache tag helper.
- Distributed cache tag helper.
Sử dụng response caching middleware
Middleware điều khiển việc cache response. Nó lưu trữ response và trả về từ cache. Đây là tính năng nằm trong thư viện Microsoft.AspNetCore.ResponseCaching được mặc định có trong ASP.NET Core
Trong Startup.ConfigureServices, thêm Response Caching Middleware vào service collection.
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCaching();
services.AddRazorPages();
}
Sử dụng thư viện làm việc với JSON mới
ASP.NET Core 3.0 sử dụng System.Text.Json làm thư viện mặc định khi thao tác với JSON. Chúng ta có thể đọc ghi JSON một cách bất đồng bộ. Nó tối ưu tốc độ hơn Newtonsoft.Json. Namespace System.Text.Json cung cấp các tính năng làm việc với JSON như sau:
- Hiệu năng cao
- Sử dụng ít tài nguyên
- Tương thích với chuẩn
- Chuyển Object sang JSON và ngược lại
Giảm số lượng HTTP request
Giảm số lượng HTTP Request là một trong số các tối ưu chính. Cache trang web và tránh chuyển hướng ở client là cách để giảm số lượng kết nối đến web server.
Sử dụng các kỹ thuật sau để giảm HTTP Request:
- Dùng minification.
- Dùng bundling.
- Dùng các hình ảnh gộp (sprite image).
Bằng cách giảm HTTP Request sẽ làm trang tải nhanh hơn
Sử dụng exception khi thật cần thiết
Các exception thường ít xảy ra. Throw và catch exception sẽ tốn tương đối thời gian trong code.
- Đừng throw và catch exception trong code flow.
- Sử dụng exception khi thật cần thiết.
- Nên dùng Global Exception handler
Nén dung lượng response
Nén response, sẽ giảm kích thước của file để tăng tốc độ. Trong ASP.NET Core có cung cấp middleware hỗ trợ việc này.
Thông thường các response không được nén. Nó thường bao gồm CSS, JavaScript, HTML, XML và JSON.
- Đừng nén các tài nguyên nén đã được nén tự nhiên (như file PNG chẳng hạn)
- Đừng nén các file nhỏ hơn 150-1000 bytes
(source: https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AspNetCoreGuidance.md)
Thư viện: Microsoft.AspNetCore.ResponseCompression được mặc định gắn vào ASP.NET Core
Đoạn code sau sẽ bât tính năng Response Compression Middleware cho các loại file trong MIME mặc định.
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseResponseCompression();
}
}
Có một số provider:
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression(options =>
{
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.Providers.Add<CustomCompressionProvider>();
options.MimeTypes =
ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "image/svg+xml" });
});
}
Tối ưu việc sử dụng HttpContext
HttpContext chỉ được truy cập trong vòng đời của HTTP request trong ASP.NET Core. Dưới đây là một số gợi ý khi dùng HttpContext từ tài liệu của Microsoft:
- Đừng lưu IHttpContextAccessor.HttpContext trong một field.
- Đừng truy cập HttpContext từ nhiều thread.
- Đừng dùng HttpContext sau khi request đã hoàn thành
- Đừng lấy HttpContext trong luồng background
Tối ưu phía client
Tối ưu phía client là một khía cạnh quan trọng để tăng hiệu năng. Khi tạo một website sử dụng ASP.NET Core hãy xem một số thủ thuật sau:
Bundling
Bundling kết hợp nhiều file vào một file duy nhất, giảm số lượng request. Bạn có thể có nhiều bundle trong một trang web.
Minification
Minification loại bỏ các ký tự không cần thiết trong code mà không thay đổi tính năng, nó cũng giảm kích thước file. Sau khi áp dụng minification, các tên biến sẽ ngắn hơn thành một ký tự và các comment cũng như khoảng trắng không cần thiết sẽ bị loại bỏ.
Tải file JavaScript cuối cùng
Tải các file JavaScript sẽ được đặt xuống cuối. Nếu làm như vậy các nội dung tĩnh sẽ hiển thị nhanh hơn, người dùng sẽ không phải đợi.
Dùng content delivery network (CDN)
Sử dụng một CDN để tải static file như hình ảnh, JS, CSS...Luôn giữ cho các dữ liệu gần nhất với người dùng từ các server gần nhất.
Kết luận
Giờ bạn đã nắm được 10 thủ thuật tăng hiệu năng của ASP.NET Core. Tôi hy vọng bạn có thể dùng nó trong ứng dụng của mình
Trích nguồn từ: https://www.syncfusion.com/blogs/post/10-performance-improvement-tips-for-asp-net-core-3-0-applications.aspx
Tags:
Bài viết liên quan
Nâng cấp RAG thành Agentic RAG với Dynamic Toolcall | Xây dựng RAG AI
Vậy làm thế nào để nâng cấp RAG thành một hệ thống Agentic RAG thông minh hơn, có khả năng tự động quyết định khi nào và nên gọi tool nào? Câu trả lời chính là Dynamic Toolcall.
Đọc thêm
Tối ưu kết quả trả về từ VectorDB với Scoring và Fingerprint | Xây dựng RAG AI
Đến Phần 3 này, chúng ta sẽ cùng nâng cấp khả năng tìm kiếm và truy vấn dữ liệu từ VectorDB.
Đọc thêmTrang bị Memory cho RAG bằng Vector Database với Qdrant
Ở phần tiếp theo này, chúng ta sẽ tiến thêm một bước quan trọng: trang bị bộ nhớ (Memory) cho RAG bằng cách sử dụng Vector Database Qdrant.
Đọc thêm
Hướng dẫn tạo ứng dụng ASP.NET Core (.NET 8) và chuẩn bị kết nối OpenAI Chat Model để xây dựng RAG AI
Trong bài viết này, chúng ta sẽ bắt đầu một hành trình nhỏ: xây dựng một ứng dụng RAG AI (Retrieval-Augmented Generation).
Đọc thêm
Ra mắt khóa học: TEDU-53: Xây dựng ứng dụng CMS với ASP.NET Core 8.0 + Angular.
Ngay bây giờ các bạn có thể đăng ký thông qua mã giảm giá tại trang chi tiết khóa học. Mã giảm giá sẽ được vô hiệu hóa khi đủ số lượng người theo thang bậc.
Đọc thêm
Migrate hệ thống ASP.NET Core 2.2 lên 3.1
Bài viết này mình đúc kết lại sau khi migrate toàn bộ hệ thống TEDU hiện tại từ .NET Core 2.2 lên 3.1 chia sẻ lại để mọi người cùng trao đổi
Đọc thêm
Tìm hiểu Unit Testing trong ASP.NET Core
Tiếp theo bài viết trước với tiêu đề Tìm hiểu về Dependency Injection trong ASP.NET Core. Hôm nay mình sẽ tập trung vào unit test.
Đọc thêm
Tìm hiểu về Dependency Injection trong ASP.NET Core
Bài viết này chúng ta sẽ cùng tìm hiểu về những điều thú vị xung quanh depedency injection và unit testing.
Đọc thêm
Cách sử dụng Yarn trong Visual Studio 2017
Cách sử dụng Yarn để quản lý các dependencies trong Visual Studio 2017
Đọc thêm
Cách dùng NPM trong ASP.NET Core thay vì Bower
Dùng Node Package Manager trong ASP.NET Core để quản lý các thư viện client thay vì Bower
Đọc thêm