HiTSDB SDK 源码解读

因为之前写过opentsdb的SDK,所以就比较留意这类接口功能比较单一,但是对性能要求比较大的SDK。
HiTSDB SDK 虽然写的非常简单,给我启发非常多,非常感谢HiTSDB SDK的作者。

一.写入接口(put)

物联网项目的业务一般是写多读少,也就是不会有很多看,但是会有无数数据写入,所以put接口对性能有着苛刻的要求。

设计解读:

1. 场景:

  • 一般对时序数据库的写入都不要求实时返回
  • 一次大批量写入,比多次少量的写更快
  • 我们调用put接口时,多半是通过少量多次调用,很少一次大量调用。

2. 整体思考
为了追求最大性能,尽量每次都是大批量写入,但是考虑场景3,所以HiTSDB设计了一个"蓄水池",每次put的数据进入"蓄水池"保存起来。我们每次从"蓄水池"捞取一定量的数据发送到TSDB。

HiTSDB SDK 源码解读_第1张图片
Put接口设计解读

3. 源码分析

3.1 put流程

抛弃细节代码,可以客户端put方法,其实就是把Point 加到ArrayBlockingQueue

//1. 
public void put(Point... points) {
    for (Point p : points) {
        this.put(p);
    }
}
//2. 
this.pointQueue = new ArrayBlockingQueue(size);
public void send(Point point) {
    if(this.backpressure){
            pointQueue.put(point);
    } else {
            pointQueue.add(point);
    }
}

3.2 send流程

  1. 创建HiTSDBClient
public HiTSDBClient(HiTSDBConfig config) throws HttpClientInitException {
    ...
    this.consumer = ConsumerFactory.createConsumer(queue, httpclient, rateLimter, config);
    this.consumer.start();
}
  1. 进入到ConsumerFactory
public static Consumer createConsumer(DataQueue buffer, HttpClient httpclient, RateLimiter rateLimiter,HiTSDBConfig config) {
    return new DefaultBatchPutConsumer(buffer,httpclient,rateLimiter,config);
}
  1. 进入到DefaultBatchPutConsumer

可以看出这步是关键,batchPutConsumerThreadCount决定上传send thread 的数量。

public DefaultBatchPutConsumer(DataQueue buffer, HttpClient httpclient, RateLimiter rateLimiter, HiTSDBConfig config) {
    ...
    threadPool = Executors.newFixedThreadPool(batchPutConsumerThreadCount, new BatchPutThreadFactory());
}
public void start() {
    for (int i = 0; i < batchPutConsumerThreadCount; i++) {
       threadPool.submit(new BatchPutRunnable(this.dataQueue, this.httpclient, this.config,this.countDownLatch,this.rateLimiter));
    }
}

你可能感兴趣的:(HiTSDB SDK 源码解读)