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/putBatchPutSummaryCallback,即資料寫入的統計模式。對應的API調用形式為
POST /api/put?summary=trueBatchPutDetailsCallback,即資料寫入的詳細模式。對應的API調用形式為
POST /api/put?details=trueBatchPutIgnoreErrorsCallback, 即資料寫入的容錯模式。對應的API調用形式為
POST /api/put?ignoreErrors=true
您可以通過設定不同業務情境來註冊相應的回調介面。寫入模式與業務情境的說明,可參見寫入模式及其響應內容。
不要在回調方法中做耗時操作。若有此需要,可以再把操作交給其他背景工作執行緒執行。
回調方法
response()與failed()被調用的時機是不一樣的:response(): 指的是寫入請求合法且被服務端處理後執行的回調。此時可以根據回調對象種類的不同,擷取一些不同的反饋資訊。failed(): 指的是寫入請求本身存在問題導致請求不合法(比如報文非法,觸發限流,鑒權失敗等等)被服務端拒絕服務時所執行的回調。
因此建議在實現Callback介面時,不要忘記實現
failed()方法。如果不實現的話,則會執行預設的failed()回調方法,其本身是一個空方法。以上關於回調介面的樣本均使用的是單值模型寫入介面的例子。對於多值模型的寫入與此類似,但對應的回調介面變為下述名稱:
MultiFieldbatchPutCallback
MultiFieldbatchPutSummaryCallback
MultiFieldbatchPutDetailsCallback
MultiFieldbatchPutIgnoreErrorsCallback