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