Get started
本章介绍了 Pulsar schema,并解释了为什么它们很重要。
Schema管理服务
对于围绕消息总线如pulsar搭建的应用来说,类型安全非常的重要。
生产者和消费者需要某种机制来在主题级别上协调类型,从而避免出现各种潜在问题。 例如,序列化和反序列化问题。
应用程序通常采用以下方法之一来保证消息传递中的类型安全。 这两种方法都被Pulsar支持,你可以在topic的基础上,自由选择采用哪一种,或者混用。
客户端方法
生产者和消费者不仅负责序列化和反序列化消息(由原始字节组成),还负责“知道”正在通过哪些主题传输的类型。
如果生产者正在发送有关主题topic-1
的温度传感器数据,则该主题的使用者在尝试将其解析为湿度传感器读数时会遇到麻烦。
生产者和消费者可以发送和接收包含原始字节数组的消息,并在“带外”基础上将所有类型的安全性强制措施留给应用程序。
服务器端方法
生产者和消费者通知系统可以通过该主题传输哪些数据类型。
通过这种方法,消息系统强制执行类型安全, 并确保生产者和消费者保持同步。
Pulsar has a built-in schema registry that enables clients to upload data schemas on a per-topic basis. 这些schema显示了,topic可以识别哪些数据类型为有效。
为什么使用 schema
启用架构后,Pulsar会解析数据,它将字节作为输入并发送字节作为输出。 尽管数据的意义超出了字节,但你需要解析数据,并且可能会遇到解析异常,这种异常主要发生在以下几种情况下:
该字段不存在
字段类型已更改(例如,将
string
更改为int
)
有几种方法可以预防和解决这些异常,例如,你可以在解析错误时捕获异常,这使得代码难以维护;或者可以采用模式管理系统来执行模式演变,而不破坏下游应用程序,并强制类型安全性以最大程度地扩展您使用的语言,解决方案就是 Pulsar Schema。
使用 Pulsar 架构,你可以构造和处理从string
之类的简单类型到更复杂的应用程序特定类型的消息时,使用特定于语言的数据类型。
Example
You can use the User class to define the messages sent to Pulsar topics.
public class User {
String name;
int age;
}
When constructing a producer with the User class, you can specify a schema or not as below.
无 Schema 情况
如果你在不指定架构的情况下构造生产者,则生产者只能产生byte []
类型的消息。 如果你有 POJO 类,则需要在发送消息之前将 POJO 序列化为字节。
Example
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 情况
如果你通过指定架构来构造生产者,则可以直接将类发送到主题,而不必担心如何将 POJO 序列化为字节。
Example
This example constructs a producer with the JSONSchema, and you can send the User class to topics directly without worrying about how to serialize it into bytes.
Producer<User> producer = client.newProducer(JSONSchema.of(User.class))
.topic(topic)
.create();
User user = new User(“Tom”, 28);
producer.send(User);
总结
当使用模式构造生产器时,不需要将消息序列化为字节,而是 Pulsar Schema 在后台执行此工作。