全部產品
Search
文件中心

Time Series Database:寫入資料

更新時間:Jul 06, 2024

TSDB SDK 使用 Point 類,表示一個時間點。一個 Point 對象表示一個時間序列(時間軸)某個時刻上的資料。

構造時間點

Point(時間點)有多種構造方法,形式比較多樣化。本節提供三種構造時間點的方法樣本。

重要

Point 的構建至少需要一個 tag 索引值對。

樣本一

構建一個時間點。用單位為秒的時間戳記表示時間,指定 Point 資料的 Metric 與多個 Tag。

// 以'秒'為時間戳記
int timestamp = (int)(System.currentTimeMillis()/1000);

// 構造 Point
Point point = Point.metric("test1")
                    .tag("tagk1", "tagv1")
                    .tag("tagk2", "tagv2")
                    .tag("tagk3", "tagv3")
                   .timestamp(timestamp).value(123.456)
                   .build();

樣本二

構建一個時間點。用單位為毫秒的時間戳記表示時間,指定 Point 資料的 Metric,Tag 使用 Map 形式的索引值對。

// 也可以'毫秒'為時間戳記
long timestamp = System.currentTimeMillis();

// 使用 HashMap 表示 Tags
Map<String,String> tagsMap = new HashMap<String,String>();
tagsMap.put("tagk1", "tagv1");
tagsMap.put("tagk2", "tagv2");

// 構造 Point
Point point = Point.metric("test1")
                    .tag(tagsMap)
                   .value(timestamp,123.456)
                   .build();

樣本三

構建一個時間點。使用java.util.Date表示時間。

// 使用 java.util.Date 表示時間。
Point point = Point.metric("test1")
                    .tag("tagk1", "tagv1")
                   .value(new Date,123.456)
                   .build();

寫入資料

TSDB-Client 有兩種寫資料的方式:同步阻塞的寫資料和非同步非阻塞的寫資料。

同步阻塞的寫資料

假設我們現在需要構建 500 個時間點提交給 TSDB。

範例程式碼

List<Point> points = new ArrayList<Point>();
構建 Point
for(int i = 0; i<500; i++) {
    long timestamp = System.currentTimeMillis();
    Point point = Point.metric("test1")
                   .tag("tagk1", "tagv1")
                   .value(timestamp, Math.random())
                   .build();
    // 手動打包資料
    points.add(point);
}

// 手動打包後提交資料
tsdb.putSync(points)
重要

出於寫入效能的考慮,同步寫的方式一般需要您手動將資料點打包成一批資料,並且建議這批資料包含500~1000個資料點。此外,也建議多個線程並發進行提交

同步寫的響應對象

您可以根據需要選擇返回的資料內容。

  • 返回Null 物件,無內容。本質是調用 POST /api/put

    Result result = tsdb.putSync(ps);
  • 返回提交概述。包含成功數和返回數。本質是調用 POST /api/put?summary=true

    SummaryResult summaryResult = tsdb.putSync(ps,SummaryResult.class);
  • 返回提交概述。包含成功數、返回數和失敗原因。本質是調用 POST /api/put?details=true

    DetailsResult detailsResult = tsdb.putSync(ps,DetailsResult.class);

非同步非阻塞的寫資料

非同步寫資料的方式比較簡單,只要有 Point 就可以提交資料。Client 會自動協助您批量地提交資料,不需要您手動打包。

如果沒有特殊需求,推薦您使用非同步非阻塞的寫資料的方式。

範例程式碼

// 構建 Point
Point point = Point.metric("test1")
                   .tag("tagk1", "tagv1")
                   .value(timestamp, Math.random())
                   .build();
// 直接提交資料
tsdb.put(point);

非同步非阻塞寫資料的回調設定

當您使用非同步寫資料的方式時,若需要擷取 Put 介面的響應結果,則需要設定回調介面。

範例程式碼

final AtomicLong num = new AtomicLong();

// 回調對象
BatchPutCallback cb = new BatchPutCallback() {

    @Override
    public void response(String address, List<Point> input, Result output) {
        long afterNum = num.addAndGet(input.size());
        System.out.println("成功處理" + input.size() + ",已處理" + afterNum);
    }

    @Override
    public void failed(String address, List<Point> input, Exception ex) {
        ex.printStackTrace();
        long afterNum = num.addAndGet(input.size());
        System.out.println("失敗處理" + input.size() + ",已處理" + afterNum);
    }

};

TSDBConfig config = TSDBConfig
                        .address("example.hitsdb.com", 8242)
                        .listenBatchPut(cb)    // 設定回調介面
                        .config();

tsdb = TSDBClientFactory.connect(config);

TSDB Client 提供了以下四種類型的 Callback 介面:

  • BatchPutCallback,即資料寫入的極簡模式。對應的API調用形式為POST /api/put

  • BatchPutSummaryCallback,即資料寫入的統計模式。對應的API調用形式為POST /api/put?summary=true

  • BatchPutDetailsCallback,即資料寫入的詳細模式。對應的API調用形式為POST /api/put?details=true

  • BatchPutIgnoreErrorsCallback, 即資料寫入的容錯模式。對應的API調用形式為 POST /api/put?ignoreErrors=true

您可以通過設定不同業務情境來註冊相應的回調介面。寫入模式與業務情境的說明,可參見寫入模式及其響應內容

重要

  1. 不要在回調方法中做耗時操作。若有此需要,可以再把操作交給其他背景工作執行緒執行。

  2. 回調方法response()failed()被調用的時機是不一樣的:

    • response(): 指的是寫入請求合法且被服務端處理後執行的回調。此時可以根據回調對象種類的不同,擷取一些不同的反饋資訊。

    • failed(): 指的是寫入請求本身存在問題導致請求不合法(比如報文非法,觸發限流,鑒權失敗等等)被服務端拒絕服務時所執行的回調。

    因此建議在實現Callback介面時,不要忘記實現 failed() 方法。如果不實現的話,則會執行預設的failed() 回調方法,其本身是一個空方法。

  3. 以上關於回調介面的樣本均使用的是單值模型寫入介面的例子。對於多值模型的寫入與此類似,但對應的回調介面變為下述名稱:

    • MultiFieldbatchPutCallback

    • MultiFieldbatchPutSummaryCallback

    • MultiFieldbatchPutDetailsCallback

    • MultiFieldbatchPutIgnoreErrorsCallback