Apache Pulsar消息队列-Get started

作者: Apache Pulsar

Get started

本章主要介绍 Pulsar schema 及其重要性。

Schema 管理

对于围绕消息总线如pulsar搭建的应用来说,类型安全非常的重要。 Producer 和 consumer 需要某种机制,以在主题级别上协调类型,从而避免出现各种潜在问题。 例如,序列化和反序列化问题。

应用程序通常采用以下方法来保证消息传递中的类型安全。 这两种方法都被Pulsar支持,你可以在topic的基础上,自由选择采用哪一种,或者混用。 Note

Currently, the Pulsar schema registry is only available for the [Java client].

客户端方法 Producer 和 consumer 不仅负责序列化和反序列化消息(由原始字节组成),还负责"确认"topic 正在传输的类型。

如果 producer 正在发送关于topic-1的温度传感器数据,则该 topic 的 consumer 在尝试解析数据为湿度传感器读数时会遇到问题。 Producer 和 consumer 可以发送并接收包含原始字节数组的消息,并在"带外"基础上将所有类型的安全强制措施留给应用程序。 服务器端方法 Producer 和 consumer 通知系统可以通过该 topic 传输哪些类型的数据。

通过这种方法,消息系统强制执行类型安全, 并确保生产者和消费者保持同步。 Pulsar has a built-in schema registry that enables clients to upload data schemas on a per-topic basis. 这些schema显示了,topic可以识别哪些数据类型为有效。

为什么使用 schema

启用 schema 后,Pulsar 会解析数据,即接收字节作为输入并发送字节作为输出。 虽然数据不仅是字节,但的确需要解析这些数据,解析时还可能发生解析异常,解析异常主要出现在以下几种情况中:

  • 字段不存在
  • 字段类型已更改(例如,将 string 更改为 int

有几种方法可以避免并解决这些异常,例如,在解析错误时捕获异常会造成代码难以维护;采用 schema 管理系统来进化 schema,而不破坏下游应用程序;最大程度执行所使用语言的类型安全,Pulsar Schema 能够解决上述问题。

在创建并处理从简单类型(如:string)到更复杂的因应用程序而异的数据类型时,通过 Pulsar schema 可以使用特定语言的数据类型。 示例 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 的情况

在不指定 schema 的情况下创建 producer,则 producer 只能 produce 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 来创建 producer,则可以直接将类发送到 topic,而无需考虑如何将 POJO 序列化为字节。 示例 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);

总结

在使用 schema 创建 producer 时,不需要将消息序列化为字节,Pulsar cchema 会在后台执行此操作。

文章列表

更多推荐

更多
  • Pulsar消息队列-一套高可用实时消息系统实现 实时消息【即时通信】系统,有群聊和单聊两种方式,其形态异于消息队列:1 大量的 group 信息变动,群聊形式的即时通信系统在正常服务形态下,瞬时可能有大量用户登入登出。2 ...
  • Pulsar消息队列-Pulsar对比Kafka笔记 很多人查看 Pulsar 之前可能对 Kafka 很熟悉,参照上图可见二者内部结构的区别,Pulsar 和 Kafka 都是以 Topic 描述一个基本的数据集合,Topic 数据又分为若干 Partition,即对数据进行逻辑上的 ...
  • Pulsar消息队列-对 2017 年一套 IM 系统的反思 信系统的开发,前前后后参与或者主导了六七个 IM 系统的研发。上一次开发的 IM 系统的时间点还是 2018 年,关于该系统的详细描述见 [一套高可用实时消息系统实现][1] ...
  • Apache APISIX文档-快速入门指南-如何构建 Apache APISIX 如何构建 Apache APISIX,步骤1:安装 Apache APISIX,步骤2:安装 etcd,步骤3:管理 Apache APISIX 服务,步骤4:运行测试案例,步骤5:修改 Admin API key,步骤6:为 Apac
  • Apache APISIX文档-快速入门指南-快速入门指南 快速入门指南,概述,前提条件,第一步:安装 Apache APISIX,第二步:创建路由,第三步:验证,进阶操作,工作原理,创建上游服务Upstream,绑定路由与上游服务,添加身份验证,为路由添加前缀,APISIX Dashboard
  • Apache APISIX文档-架构设计-APISIX APISIX,软件架构,插件加载流程,插件内部结构,配置 APISIX,插件加载流程,比如指定 APISIX 默认监听端口为 8000,并且设置 etcd 地址为 http://foo:2379, 其他配置保持默认。在 ...
  • Apache APISIX文档-架构设计-Service Service 是某类 API 的抽象(也可以理解为一组 Route 的抽象)。它通常与上游服务抽象是一一对应的,Route 与 Service 之间,通常是 N:1 的关系,参看下图。不同 Route 规则同时绑定到一个 Service ...
  • Apache APISIX文档-架构设计-Plugin Config 如果你想要复用一组通用的插件配置,你可以把它们提取成一个 Plugin config,并绑定到对应的路由上。举个例子,你可以这么做:创建 Plugin config,如果这个路由已经配置了 plugins,那么 Plugin config ...
  • Apache APISIX文档-架构设计-Debug Mode 注意:在 APISIX 2.10 之前,开启基本调试模式曾经是设置 conf/config.yaml 中的 apisix.enable_debug 为 true。设置 conf/debug.yaml 中的选项,开启高级调试模式。由于 ...
  • Apache APISIX文档-架构设计-Consumer 如上图所示,作为 API 网关,需要知道 API Consumer(消费方)具体是谁,这样就可以对不同 API Consumer 配置不同规则。授权认证:比如有 [key-auth] 等。获取 consumer_...
  • 近期文章

    更多
    文章目录

      推荐作者

      更多