用分佈式緩存提高ASP.NET Core性能

得益於純淨、輕量化而且跨平臺支持的特性,ASP.NET Core做爲熱門Web應用開發框架,其高性能傳輸和負載均衡的支持已廣受青睞。實際上,10-20臺Web服務器仍是輕鬆駕馭的。有了多服務器負載的支持,使得Web應用層在業務增加時隨時採用水平擴展,ASP.NET Core也可以沒有什麼負擔地處理長事務。然而形成性能瓶頸的地方仍然不可忽視,具體來講首當其衝就是數據存儲,沒法隨着應用層的性能提高而提升大規模數據處理能力,這是由於數據層是沒有辦法簡單經過增長服務器獲得改善的。php

ASP.NET Core應用有兩類數據在數據存儲成爲瓶頸時突顯出來:html

  1. 數據庫
  2. Session會話

解決方案: 分佈式緩存


解決這個性能瓶頸,不妨試試NCache,它是一個開源的支持.NET的分佈式緩存,它的優點在於徹底基於內存,因此你能夠在業務增加時組建內存服務器的集羣來實現線性擴展,相比於數據庫能節省近八成的成本,而且在讀寫應用數據上獲得更快的體驗。NCache很適合存儲session會話,在多Web服務器負載時也解決了會話保持的需求。redis

下圖是NCache這類常見的分佈式緩存的部署架構。數據庫

ASP.NET Core應用數據緩存IDistributedCache


在ASP.NET Core以前,舊的ASP.NET程序的緩存對象是獨立進程的,也沒有多服務器支持的須要。現今ASP.NET Core推出了IDistributedCache統一接口,定義了分佈式緩存的基本接口,相似於日誌、注入容器的接口同樣,能夠無縫提供第三方擴展。json

IDistributedCache接口使用示例:數組

IDistributedCache _cache;
...
private byte[] LoadCustomer(string custId) {
    string key = "Customers:CustomerID:" + custId;
    // is the customer in the cache?
    byte[] customer = _cache.Get(key);
 
    if(customer == null) {
       // the cache doesn't have it. so load from DB
       customer = LoadFromDB(key);
       // And, cache it for next time
       _cache.Set(key, customer);
    }
 
    return customer;
}

NCache是IDistributedCache的一種實現,因此在ASP.NET Cor應用中使用NCache不須要特殊的配置。緩存

如下是IDistributedCache接口的定義(注意每一個方法都有對應的Async版本的重載)。服務器

namespace Microsoft.Extensions.Caching.Distributed
{
    public interface IDistributedCache
    {
        // Each of these methods also has an 「Async」 overload
        byte[] Get(string key);
        void Refresh(string key);
        void Remove(string key);
 
        // Specify absolute & sliding expiration thru options
        void Set(string key, byte[] value, DistributedCacheEntryOptions options);
    }
}

接下來在ASP.NET Core的Startup類中配置NCacheIDistributedCachesession

public class Startup
{
    ...
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddNCacheDistributedCache();
        ...
    }
    ...
}

若是對緩存需求不高, 使用IDistributedCache保留了更改分佈式緩存靈活性。可是要權衡這種放棄高級緩存特性的成本。爲何不考慮一下NCache?NCache API在ASP.NET Core應用內能夠直接使用,和舊的ASP.NET Cache API很是類似,它包含了大量零成本新特性,能夠得到企業級的分佈式緩存收益。記住一點,看在性能提高和擴展能力的份上,早用早享受。沒有這些高級特性,那隻能可憐地緩存一些簡單數據。這份NCache caching features瞭解更多差異。架構

ASP.NET Core會話存儲到分佈式緩存


舊的ASP.NET的會話狀態由框架提供,容許第三方組件以插件形式接入。在ASP.NET Core中的會話也是類似的,採用鏈式插件調用,有兩種方式使用NCache做爲ASP.NET Core的會話存儲:

1.NCache做爲ASP.NET Core的IDistributedCache Provider存儲配置

若是把NCache做爲ASP.NET Core的IDistributedCache provider進行配置,NCache能自動的成爲會話的默認存儲方式,不用再有多餘的操做。可是相比於舊的ASP.NET會話狀態,這種方式能使用到的特性有限。

如下是ASP.NET Core默認會話缺失的地方:

  1. ASP.NET Core無會話鎖提供。
  2. 自定義對象的byte數組支持:  ASP.NET Core強制你在把自定義對象存儲到會話前先轉換成byte數組。

2. NCache做爲ASP.NET Core的Sessions Provider配置

比起前一個方式,NCache已經實現了ASP.NET Core的Sessions Provider。這種方式擁有更多的特性能夠利用。

如下是在Startup類進行配置的示例。

public class Startup
{
    ...
    public void Configure(IApplicationBuilder app,  IHostingEnvironment env)
    {
        ...
        app.UseNCacheSession();
        ...
    } 
    ...
}

你能夠在appsettings.json文件中作以下ASP.NET Core會話配置。

{
    ...
    "NCacheSessions": {
        ...
        "CacheName": "demoCache",
        "EnableLogs": "True",
        "RequestTimeout": "90",
        "EnableDetailLogs": "False",
        "ExceptionsEnabled": "True",
        "WriteExceptionsToEventLog": "False"
    }
    ...
} 

Configure NCache IDistributedCache Provider瞭解更多會話存儲配置信息。

NCache是比Redis成爲ASP.NET Core更好選擇的緣由


微軟提供了IDistributedCache Providers兩種可選方案。一個是SQL Server另外一個是Redis。NCache比這兩種方案更勝一籌表面上看是由於執行更快,更易擴展,固然還有如下緣由:

  1. 原生.NET:  NCache是100%原生.NET,更易融入.NET應用技術棧。反觀來自Linux背景的Redis和原生.NET畢竟有兼容潛在問題。
  2. 比Redis更快:  NCache確實比Redis要快。NCache客戶端緩存的執行能力表現不俗。
  3. 更多特性:  NCache提供了Redis所沒有的分佈式緩存特性。參見這裏:Redis vs NCache

 

NCache更多詳情:Nache Details  Edition Comparison  Download

 

(原文:How to Optimize ASP.NET Core Performance with Distributed Cache?

相關文章
相關標籤/搜索