Pulsar 2.5.0 之 Schema 入门
官网原文标题《Get started》
翻译时间:2020-02-14
官网原文地址: http://pulsar.apache.org/docs/en/schema-get-started/
译者:本章介绍 Pulsar schema 并解释它们为什么重要
Schema 注册表
类型安全在任何围绕消息总线(如Pulsar)构建的应用程序中都非常重要。生产者和消费者需要某种机制来协调主题级别的类型,以避免出现各种潜在的问题。例如,序列化和反序列化问题。应用程序通常采用以下方法之一来保证消息传递中的类型安全。这两种方法都可以在Pulsar中使用,您可以自由地采用其中一种或另一种,也可以根据每个主题进行混合和匹配。
客户端方法
生产者和消费者不仅负责序列化和反序列化消息(由原始字节组成),而且还“知道”哪些类型通过哪些主题进行传输。如果生产者发送主题为“主题1”的温度传感器数据,则该主题的消费者如果试图将该数据解析为湿度传感器读数,将遇到麻烦。生产者和消费者可以发送和接收由原始字节数组组成的消息,并在“带外”的基础上将所有类型安全强制留给应用程序。
服务器端方法
生产者和消费者通知系统哪些数据类型可以通过主题进行传输。通过这种方法,消息传递系统强制执行类型安全,并确保生产者和消费者保持同步。Pulsar有一个内置的schema注册表,它允许客户端按主题上传数据schema。这些schema指示哪些数据类型被识别为对该主题有效。
为什么使用 schema
当schema启用时,Pulsar会解析数据,它以字节作为输入,以字节作为输出。为了理解字节数据含义,需要解析数据,并且可能会遇到解析异常,这些异常主要发生在以下情况:
字段不存在
字段类型已更改(例如,“string”更改为“int”)
为了防止和克服这些异常,例如,可以在分析错误时捕获异常,这使得代码很难维护;也可以采用schema管理系统来执行schema演化,而不是中断下游应用程序,并在所使用的语言中强制类型安全性达到最大扩展,Pulsar schema就是解决方案。
Pulsar schema允许您在构造和处理从简单类型(如“string”)到复杂的应用程序特定类型的消息时,使用特定语言数据类型。
示例
您可以使用User类定义发送到 Pulsar主题的消息
public class User {
String name;
int age;
}
当使用User类构造生产者时,可以按如下所示指定 schema或不指定 schema
不使用schema
如果在不指定schema的情况下构造生产者,则生产者只能生成“byte[]”类型的消息。如果有POJO类,则在发送消息之前需要将POJO序列化为字节
示例
Producer<byte[]> producer = client.newProducer()
.topic(topic)
.create();
User user = new User(“Tom”, 28);
byte[] message = … // serialize the `user` by yourself;
producer.send(message);
使用 schema
如果您通过指定schema来构造生产者,则可以直接将类发送到主题,而不必担心如何将pojo序列化为字节。
示例
本例使用JSONSchema构造一个producer,您可以直接将User类发送到主题,而不必担心如何将其序列化为字节。
Producer<User> producer = client.newProducer(JSONSchema.of(User.class))
.topic(topic)
.create();
User user = new User(“Tom”, 28);
producer.send(user);
温馨提示
使用schema构造生产者时,不需要将消息序列化为字节,而Pulsar schema在后台执行此任务。