Hỏi - đáp Nơi cung cấp thông tin nghề nghiệp và giải đáp những thắc mắc thường gặp của bạn

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:

    1. Dùng minification.
    2. Dùng bundling.
    3. 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

    (sourcehttps://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:

    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.

    Nguồn: tedu.com.vn