Pulsar IO 中 Schema 的调用流程

背景

Pulsar Connector 系列的前几篇文章已介绍了 Source、Sink 与 Producer、Consumer 的关系。内建的 Source 封装了 Consumer、内建的 Sink 封装了 Producer,所以,Source 与 Sink 是对 pub/sub 模式的一个深层次的应用。
Pulsar 在与其余系统集成时,Schema 帮助 Pulsar 保留了数据在其余系统中原有的含义。例如,数据库中表的各个字段和信息均可以经过 Schema 表达。数据库

Schema 的内容比较多,本文简单介绍 Source、 Sink 与 Schema 的关系;其余部分,例如, Schema 的版本、注册中心和兼容性等会在以后的文章中介绍。ui

Schema 定义

Schema 是一种描述数据的数据。例如,数据库中表的信息和字段类型等都是 Schema。Pulsar 对 Schema 也有比较好的支持。this

Schema 简单应用

在使用 pub/sub 生产和消费消息时,能够经过如下代码使用 Schema:code

public class SensorReading {
    public float temperature;

    public SensorReading(float temperature) {
        this.temperature = temperature;
    }

    // A no-arg constructor is required
    public SensorReading() {
    }

    public float getTemperature() {
        return temperature;
    }

    public void setTemperature(float temperature) {
        this.temperature = temperature;
    }
}
Producer<SensorReading> producer = client.newProducer(JSONSchema.of(SensorReading.class))
    .topic("my-topic")
    .create();
Consumer consumer = client.newConsumer(JSONSchema.of(SensorReading.class))
        .topic("my-topic")
        .subscriptionName("my-subscription")
        .subscribe();

经过以上操做,生产者和消费者能够识别出关于 SensorReading 这个类的含义。这是 Schema 在客户端的应用,也是比较广泛的使用方法。ip

前文已经提到,Source 和 Sink 是对 pub/sub 的封装,所以,Schema 的应用也是基于以上原理。如下为详细说明。get

Source 中的 Schema

在内建的 Sink 中,实现了一个 Consumer,用于接收从 Pulsar 发来的数据。input

if (conf.getSerdeClassName() != null && !conf.getSerdeClassName().isEmpty()) {
    schema = (Schema<T>) topicSchema.getSchema(topic, typeArg, conf.getSerdeClassName(), true);
} else {
    schema = (Schema<T>) topicSchema.getSchema(topic, typeArg, conf.getSchemaType(), true);
}

getSerdeClassName 会获取用户指定的用于序列化与反序列化的类,经过指定 --custom-serde-inputs 参数,从而构建真正的 Schema。it

case NONE:
  return (Schema<T>) Schema.BYTES;

case AUTO_CONSUME:
case AUTO:
  return (Schema<T>) Schema.AUTO_CONSUME();

case STRING:
  return (Schema<T>) Schema.STRING;

case AVRO:
  return AvroSchema.of(SchemaDefinition.<T>builder().withPojo(clazz).build());

case JSON:
  return JSONSchema.of(SchemaDefinition.<T>builder().withPojo(clazz).build());

case KEY_VALUE:
  return (Schema<T>)Schema.KV_BYTES();

case PROTOBUF:
  return ProtobufSchema.ofGenericClass(clazz, Collections.emptyMap());
}

目前,在 Source 中支持的 Schema 包括以上示例中的 JSONSchema。该 Schema 生成以后,会被 Consumer 进行初始化,用于解析 Producer 中发出的数据。io

Sink 中的 Schema

在 Sink 中,Schema 的使用流程与原理同上,在此就再也不赘述。class

总结

Schema 帮助保留了数据的元信息,Source 和 Sink 做为 与外部系统集成的组件,对 Schema 的良好的支持具备重要的意义。

相关文章
相关标签/搜索