開源Influxdb2高效能客戶端

jiulang發表於2021-04-26

前言

最近我在瞭解時序資料庫Influxdb 2.x版本,體驗一翻之後,感覺官方的出品的.net客戶端還有很多優化的地方,於是閉關幾天,不吃不喝,將老夫多年練就的高效能網路通訊與高效能Buffer操作的功力融入其中,終於寫出Influxdb2.Client這個客戶端。

不追求完整功能

官方的客戶端,提供全功能Api,其中90%以上是管理用,這個和直接在Influxdb的管理皮膚UI上操作是完全一樣的,Influxdb2.Client沒有提供這些功能,只是提供了查詢與寫入的功能。

更簡單的配置

Influxdb大改後的2.x版本和1.x版本出入很大,官方的客戶端由於要相容1.x版本,所以在配置上顯得很凌亂,一不小心就把1.x的配置對著2.x的伺服器,然後就異常了。Influxdb2.Client由於沒有這些包袱,同時使用了Microsoft.Extensions.Options,配置簡單明瞭

// 註冊與配置Infuxdb服務
services.AddInfuxdb(o =>
{
    o.Host = new Uri("http://localhost:8086");
    o.Token = "base64 token value";
    o.DefaultOrg = "my-org"; // 查詢或寫入資料時,省略的org引數的預設值
    o.DefaultBucket = "my-bucket"; // 查詢或寫入資料時,省略的bucket引數的預設值
});

更易用的查詢功能

官方的客戶端只支援string查詢的flux語句,2.0以後的flux語句,估計沒人願意記住,Influxdb2.Client多提供了IFlux查詢引數物件,對並IFlux提供了近30個函式擴充套件,使用時任意疊堆這些函式,如同Linq一樣親切,開發者也可以為IFlux增加更多函式擴充套件。

    /// <summary>
    /// 查詢資料
    /// </summary>
    /// <typeparam name="TModel"></typeparam>
    /// <param name="flux">flux表示式</param>
    /// <param name="org">組織</param>
    /// <returns></returns>
    Task<TModel[]> QueryAsync<TModel>(IFlux flux, string? org = default) where TModel : new();

    /// <summary>
    /// 查詢資料
    /// </summary>
    /// <typeparam name="TModel"></typeparam>
    /// <param name="flux">flux表示式</param>
    /// <param name="org">組織</param>
    /// <returns></returns>
    Task<TModel[]> QueryAsync<TModel>(string flux, string? org = default) where TModel : new();


    /// <summary>
    /// 查詢資料
    /// </summary>
    /// <param name="flux">flux表示式</param>
    /// <param name="org">組織</param>
    /// <returns></returns>
    Task<IDataTableCollection> QueryAsync(IFlux flux, string? org = default);

    /// <summary>
    /// 查詢資料
    /// </summary>
    /// <param name="flux">flux表示式</param>
    /// <param name="org">組織</param>
    /// <returns></returns>
    Task<IDataTableCollection> QueryAsync(string flux, string? org = default);

更高的效能

效能是Influxdb2.Client最關注的面,從網路請求、資料編碼解碼、模型描述等層面都進行了效能極限優化。現在,使用靜態資源伺服器響應csv檔案模擬Influxdb資料庫,官方客戶端查詢耗時是Influxdb2.Client的180%。高度併發請求之後,由於GC關係,這個耗時比例還會有所增加。

ref struct ValueStringBuilder

使用ValueStringBuilder儲存編碼或解碼後的資料內容,0GC壓力;

RecyclableBufferWriter

使用RecyclableBufferWriter緩衝寫入的資料二進位制(或unicode文字)內容,傳送資料之後回收複用RecyclableBufferWriter佔用的Buffer,記憶體0分配,而官方的寫入資料,還是基於StringBuilder拼接字串,然後utf8編碼為byte[],最後才複製到請求網路流。

泛型的EntityDesciptor等

靜態泛型型別的欄位儲存各屬性的Desciptor,無快取查詢。

基於Span的CsvReader

讀取CSV流時,解析CSV行內容都是基於Span

如何使用

如果你需要用到時序資料庫Influxdb,也想使用這個庫,可以連線到github檢視更多使用方法或查詢原始碼。

相關文章