写点什么

Pulsar 在 2.8 升级过程中需要注意的 TopicPolicy 问题

作者:Zike Yang
  • 2021 年 11 月 25 日
  • 本文字数:1327 字

    阅读完需:约 4 分钟

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 的定义:

public class PulsarEvent {
private EventType eventType; private ActionType actionType; private TopicPoliciesEvent topicPoliciesEvent;}
public class TopicPoliciesEvent {
private String domain; private String tenant; private String namespace; private String topic; private TopicPolicies policies;}
复制代码

在 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 定义如下:


{  "name": "subscriptionTypesEnabled",  "type": [    "null",    {      "type": "array",      "items": {        "type": "enum",        "name": "SubType",        "namespace": "org.apache.pulsar.common.api.proto.CommandSubscribe",        "symbols": [          "Exclusive",          "Shared",          "Failover",          "Key_Shared"        ]      },      "java-class": "java.util.List"    }  ],  "default": null}
复制代码

在 Avro schema 中,其默认值被设置为了 null 而不是在 TopicPolicy 类中的默认值空数组:

@Builder.Defaultprivate List<SubType> subscriptionTypesEnabled = new ArrayList<>();
复制代码

而类中的默认值只对于在 Pulsar2.8 中初始化的 TopicPolicy 有效,对于 2.7 中的,其默认值为 null,所以我们在升级后去获取新字段的值,会得到 null。

这时我们需要手动去设置这些新字段的值,如:

bin/pulsar-admin topics set-subscription-types-enabled -t Exclusive,Shared,Failover,Key_Shared my-topic
复制代码


在升级 Pulsar 2.8 的过程中,我们需要注意这些问题,根据业务给出合适的解决方案。

发布于: 2 小时前阅读数: 5
用户头像

Zike Yang

关注

还未添加个人签名 2020.10.20 加入

Apache Pulsar Contributor

评论

发布
暂无评论
Pulsar 在2.8升级过程中需要注意的TopicPolicy问题