如何为 GreptimeDB 开发一个 gRPC SDK

GreptimeDB 的 gRPC SDK 只需要处理写请求即可。读请求是标准 SQL 或 PromQL ,可以由任何 JDBC 客户端或 Prometheus 客户端处理。这也是为什么所有的 GreptimeDB SDK 都命名为 “greptimedb-ingester-<language>“。请确保你的 GreptimeDB SDK 遵循相同的命名约定。

GreptimeDatabase 服务

GreptimeDB 自定义了一个 gRPC 服务:GreptimeDatabase 。你只需要实现这个服务即可。你可以在这里 找到它的 Protobuf 定义。

GreptimeDatabase 有 2 个 RPC 方法:

  1. service GreptimeDatabase {
  2. rpc Handle(GreptimeRequest) returns (GreptimeResponse);
  3. rpc HandleRequests(stream GreptimeRequest) returns (GreptimeResponse);
  4. }

Handle 方法是一个 unary 调用:当 GreptimeDB 服务接收到一个 GreptimeRequest 请求后,它立刻处理该请求并返回一个相应的 GreptimeResponse

HandleRequests 方法则是一个 “[Client Streaming RPC][3]“ 方式的调用。 它可以接受一个连续的 GreptimeRequest 请求流,持续地发给 GreptimeDB 服务。 GreptimeDB 服务会在收到流中的每个请求时立刻进行处理,并最终(流结束时)返回一个总结性的 GreptimeResponse。 通过 HandleRequests,我们可以获得一个非常高的请求吞吐量。

GreptimeRequest

GreptimeRequest 是一个 Protobuf 消息,定义如下:

  1. message GreptimeRequest {
  2. RequestHeader header = 1;
  3. oneof request {
  4. InsertRequests inserts = 2;
  5. QueryRequest query = 3;
  6. DdlRequest ddl = 4;
  7. DeleteRequests deletes = 5;
  8. RowInsertRequests row_inserts = 6;
  9. RowDeleteRequests row_deletes = 7;
  10. }
  11. }

RequestHeader 是必需,它包含了一些上下文,鉴权和其他信息。”oneof” 的字段包含了发往 GreptimeDB 服务的请求。

注意我们有两种类型的插入请求,一种是以 “列” 的形式(InsertRequests),另一种是以 “行” 的形式(RowInsertRequests )。通常我们建议使用 “行” 的形式,因为它对于表的插入更自然,更容易使用。但是,如果需要一次插入大量列,或者有大量的 “null” 值需要插入,那么最好使用 “列” 的形式。

GreptimeResponse

GreptimeResponse 是一个 Protobuf 消息,定义如下:

  1. message GreptimeResponse {
  2. ResponseHeader header = 1;
  3. oneof response {AffectedRows affected_rows = 2;}
  4. }

ResponseHeader 包含了返回值的状态码,以及错误信息(如果有的话)。”oneof” 的字段目前只有 “affected rows”。

GreptimeDB 现在有很多 SDK,你可以参考这里获取一些示例。