開源Influxdb2高性能客戶端

前言

最近我在瞭解時序數據庫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查看更多使用方法或查詢源代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章