Pulsar 在 2.8 升级过程中需要注意的 TopicPolicy 问题
Pulsar 在 2.7 版本中引入了 TopicPolicy,使我们能够在 Topic 级别上设置 Polic,而在 Pulsar 2.8 中,对 TopicPolicy 带来了许多更新,也存在一些兼容性的问题,本文主要介绍这些兼容性问题以及相应的解决方案。
ChangeEvent Topic 的 Schema 兼容问题
TopicPolicy 不同于 Namespace 以及 Broker 层面的 Policy,它并不是存储与 ZooKeeper 上的,因为 Pulsar 目标承载的 Topic 数量非常多,如果将 TopicPolicy 由 ZooKeeper 管理,会对 ZooKeeper 带来巨大的压力,为此,我们使用一个名为__change_events 的 System Topic 来管理 TopicPolicy。
__change_events 使用消息数据结构是 PulsarEvent,__change_events 上有 reader 和 writer,reader 用来监听 TopicPolicy 发生 Insert、Update 和 Delete 的事件,而当 TopicPolicy 发生这些事件时,writer 会将 PulsarEvent 发送到 TopicPolicy 上。
如下是 PulsarEvent 以及其内部的 TopicPoliciesEvent 的定义:
在 Pulsar 2.8 中,因为引入了许多 TopicPolicy 的各类字段的更改,使得默认的 FULL 的 schema 兼容性检查不能通过。这导致在升级后,订阅__change_events 的 reader 和 writer 无法成功创建。此时需要关闭__change_events 的兼容性检查,即可解决问题。
一些 TopicPolicy 字段为 null 问题
在 Pulsar 2.8 中,为 TopicPolicy 添加了许多字段,如 SubscriptionTypesEnable,虽然 Pulsar 为 SubscriptionTypesEnable 添加了空数组作为默认值,但这只对从 Pulsar 2.8 及以后进行初始化的 TopicPolicy 有效。如果我们在 Pulsar 2.7 中初始化某个 Topic 的 TopicPolicy,在 2.8 中获取新添加的字段,其值不再是默认期望的值,比如 SubscriptionTypesEnable 的空数组,而是 null。
这是因为,对于新加入的 Optional 字段,其 Avro 定义如下:
在 Avro schema 中,其默认值被设置为了 null 而不是在 TopicPolicy 类中的默认值空数组:
而类中的默认值只对于在 Pulsar2.8 中初始化的 TopicPolicy 有效,对于 2.7 中的,其默认值为 null,所以我们在升级后去获取新字段的值,会得到 null。
这时我们需要手动去设置这些新字段的值,如:
在升级 Pulsar 2.8 的过程中,我们需要注意这些问题,根据业务给出合适的解决方案。
版权声明: 本文为 InfoQ 作者【Zike Yang】的原创文章。
原文链接:【http://xie.infoq.cn/article/fe79a5d4e71ad6bc3c7963138】。文章转载请联系作者。
评论