Apache Pulsar 2.5.2 版本深度解析:命名空间级策略、稳定性修复与关键特性全览

发布时间:2026/9/23 15:44:40
Apache Pulsar 2.5.2 版本深度解析:命名空间级策略、稳定性修复与关键特性全览 Apache Pulsar 2.5.2 版本深度解析命名空间级策略、稳定性修复与关键特性全览【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsarApache Pulsar 2.5.2 是社区在 2.5 系列基础上的一次重要补强版本由超过 56 个 commit 构成涵盖通用功能改进与大量缺陷修复。本篇文章以官方发布公告为主体结合当前仓库源码逐项解析该版本引入的命名空间级自动建 Topic 覆盖、按命名空间配置的 offload 删除策略、基于间隔的 retention 检查、Netty 安全升级、TLS keystore 配置、Pulsar Functions 异步模式等核心变更帮助读者理解每个特性背后的设计动机、配置入口与底层实现为升级与使用 2.5.2 提供参考依据。命名空间级策略自动创建 Topic 的 Override 机制背景broker 级 autoTopicCreation 的粒度局限在 2.5.2 之前autoTopicCreation自动创建 Topic只能作为 broker 级配置在 ServiceConfiguration.java 中全局开启或关闭。这意味着运维人员无法针对单个命名空间差异化控制自动建 Topic 行为——要么全局放开要么全局关闭。2.5.2 引入的 namespace policy2.5.2 引入了新的命名空间策略autoTopicCreationOverride允许在命名空间级别覆盖 broker 的autoTopicCreation设置。典型场景是broker 全局关闭自动建 Topic但允许某个特定命名空间开启该能力从而兼顾安全性与业务灵活性。从实现上看该策略作为命名空间级 policy 下发broker 在创建 Topic 时会先检查命名空间策略是否存在 override再决定是否允许自动创建。对运维而言这意味着可以通过pulsar-admin namespaces系列命令管理自动建 Topic 的粒度而无需改动 broker 配置文件并重启服务。Offload 策略按命名空间自定义 deletionLag 与阈值分层存储tiered storage允许将旧数据从 BookKeeper 卸载offload到外部存储。2.5.2 之前deletionLag删除延迟与触发 offload 的阈值只能在策略层面全局设定该版本支持在 offload policy 中按命名空间配置deletionLag和阈值从而按命名空间精确控制数据从 offload 存储中移除的时机。在源码层面offload 策略由 OffloadPoliciesImpl.java 承载其中managedLedgerOffloadPrefetchRounds默认值见DEFAULT_OFFLOAD_MAX_PREFETCH_ROUNDS用于控制 offload 时 ledger 读取的最大预取轮数详见后文避免 offload 到 HDFS 时预取过多数据一节。命名空间级 policy 与 broker 配置的覆盖关系与autoTopicCreationOverride的设计思路一致均是为了让策略下发更贴近业务边界。稳定性改进ZooKeeper 缓存失效替代重载问题频繁建删 Topic 导致 ZooKeeper 缓存重载风暴此前当 Topic 被频繁创建或删除时ZooKeeper 的 children cache 会针对 z-node 整体重载。这一行为会给 ZooKeeper 与 broker 带来额外负载拖慢 broker 并削弱其稳定性。解决方案ZooKeeperManagedLedgerCache2.5.2 引入ZooKeeperManagedLedgerCache在 Topic 创建或删除时改为失效invalidate缓存条目而不是整体重载缓存从而显著降低 ZooKeeper 压力。该组件位于 managed-ledger 模块managed-ledger是 broker 与 ZooKeeper 之间 metadata 缓存路径上的关键改进对高频建删 Topic 的场景如大量临时 Topic 的流式应用收益明显。Retention 策略无流量时也能按时清理已消费 Ledger此前行为依赖 ledger rollover 触发检查在 2.5.2 之前的版本中retention 检查只在 ledger rollover滚动发生时进行。如果流量停止即使所有消息都已被确认acknowledgedledger 也不会被清理导致存储空间持续被占用。2.5.2 的间隔检查机制2.5.2 引入 broker 配置retentionCheckIntervalInSeconds让 broker 能够按固定间隔检查已被消费的 ledger 是否需要进行裁剪trim。该配置定义于 ServiceConfiguration.java默认值为120秒FieldContext( category CATEGORY_SERVER, doc Check between intervals to see if consumed ledgers need to be trimmed ) private int retentionCheckIntervalInSeconds 120;当该值被设置为0或负数时系统不再检查已消费的 ledger即关闭间隔清理能力。该配置位于 broker 配置的CATEGORY_SERVER分类下可在conf/broker.conf中调整。注意其语义与retention策略保留时长/大小是配套关系retention 决定数据保留多久而retentionCheckIntervalInSeconds决定多久检查一次是否可裁剪。安全修复Netty 升级至 4.1.48.Final漏洞背景Netty 4.1.x4.1.46 之前中的ZlibDecoders在解码 ZlibEncoded 字节流时允许无界内存分配。攻击者可向 Netty 服务器发送超大的 ZlibEncoded 字节流迫使服务器将全部可用内存分配给单个解码器形成内存耗尽型拒绝服务攻击。升级动作2.5.2 将 Netty 版本提升至4.1.48.Final以修复该漏洞。对于使用 Pulsar 2.5.x 且暴露于不可信网络的部署建议尽快升级到 2.5.2 或更高版本对于已升级的用户应关注 broker/proxy 的 Netty 相关依赖是否统一Pulsar 各模块通过父 POM 统一管理 Netty 版本升级后各模块保持一致。主题加载超时与游标状态修复增加复制主题的加载超时时间加载带复制的主题是相当昂贵的操作涉及全局 ZooKeeper 查找以及多个子进程的启动。在 2.5.2 中将含多个复制集群的主题加载超时时间提升到 60 秒避免复杂复制拓扑下主题加载因超时而过早失败。修复无消费者游标的错误状态此前存在一个缺陷当订阅的所有消费者关闭后游标cursor会被置为 inactive但在PulsarStats.updateStats()执行时若 backlog 大小小于backloggedCursorThresholdEntries游标会被错误地重新置为 active。2.5.2 将checkBackloggedCursors()从ManagedLedger迁移到Topic层并在判断时检查消费者列表从而保证无消费者即 inactive的状态正确性。非持久游标改为 active 以提升读性能在非持久订阅non-durable subscription模式下此前游标不被激活导致写入的 entries 不会进入缓存进而降低读取性能。2.5.2 将NonDurableCursorImpl置为 active并移除setActive()、isActive()、setInactive()三个 override 方法简化实现的同时改善非持久订阅的读取路径。TLS新增 keystore 配置支持自定义 CA2.5.2 在 TLS 体系中新增了 keystore 配置能力允许用户定义自己的 CA 证书而内部通信继续使用内部 CA 证书。这一改动保持原有 TLS 设置不变仅在需要的路径上新增配置项。其价值在于对外服务如客户端接入可以使用企业自有 CA 签发的证书内部节点间通信仍走 Pulsar 内部 CA做到内外部信任域分离。具体配置项分布在 broker、proxy 等组件的 TLS 配置段落中用户可按需在conf/broker.conf、conf/proxy.conf中补充 keystore 相关设置。客户端健壮性Topic 不存在时关闭 Producer问题非存在 Topic 上的 Producer 悬挂此前当为不存在的 Topic 创建 producer 时ProducerImpl对象会悬挂hang在线程 dump 中。对于误向不存在 Topic 持续生产的微服务这会导致 OOM。2.5.2 的双管齐下该版本从两方面修复修复非存在 Topic 场景下的异常处理exception handle当 producer 收到TopicDoesNotExists异常时将状态切换为Close。这样 producer 能快速失败并释放资源而不是无限悬挂等待。速率限制与监控指标修复重启后 topicPublishRateLimiter 失效此前在命名空间上配置发布速率publishing rate可以限制发布速度但 broker 重启后该限制会失效。2.5.2 修复了这一缺陷确保命名空间级发布限速在 broker 重启后依然生效。新增 out 方向监控指标2.5.2 为命名空间namespace、订阅subscription、消费者consumer维度新增pulsar_out_bytes_total与pulsar_out_messages_total两个计数器指标。其设计动机是在 Prometheus 抓取周期内若仅有速率rate类指标而缺少累计值可能造成速率计算缺失或变化被遗漏。累计计数器可以配合 Prometheus 的rate()/increase()函数得到准确的变化量。Schema 与序列化相关修复修复 ttlDurationDefaultInSeconds 策略命名空间的 TTL 应当在其未配置于命名空间策略时从 broker 配置中获取。此前代码直接返回命名空间策略中存储的值未判断 TTL 是否真的被配置。2.5.2 增加条件判断若命名空间策略未配置 TTL则回退读取 broker 配置并返回。修复 GenericJsonRecord 的 long 字段解析对于使用 JSON schema 发送的消息当 long 字段值小于Integer.MAX_VALUE时会被错误解码为 int否则被解码为字符串。2.5.2 在GenericJsonRecord中引入字段类型检查保证 long 字段始终按 long 类型解码。修复 Avro schema 消息编码失败时的游标泄漏若 Avro 编码在写入几个字节后失败流中的游标不会被重置正常情况下负责重置游标的flush()会因异常被跳过。2.5.2 在 finally 块中引入flush()确保异常路径下游标也能复位避免流状态污染影响后续消息。C 客户端主题分区数自动更新2.5.2 的 C 客户端支持已创建的 producer 和 consumer 在主题分区数更新后自动感知分区变化具体实现包括在PartitionedConsumerImpl与PartitionedProducerImpl中增加boost::asio::deadline_timer注册周期性的查找任务lookup task以检测分区变化新增一个 unsigned int 配置参数用于指示检测分区变化的周期在PartitionedConsumerImpl::receive中将mutex_的解锁时机调整到检查完state_之后避免状态检查期间的锁竞争或悬空访问。相关实现可在 PartitionedProducerImpl.cc 及同目录的PartitionedConsumerImpl.cc中查看类定义位于 PartitionedProducerImpl.h 与PartitionedConsumerImpl.h。消息 ID 相关修复回调与分区主题修复 send 回调中的默认消息 ID此前发送回调中的MessageId始终是默认值(-1, -1, -1, -1)。2.5.2 移除了BatchMessageContainer::MessageContainer中无用的messageId字段并为batchMessageCallBack增加const MessageId参数从而在消息发送成功后回调中可以拿到真实的消息 ID。修复分区主题消息 ID 的 partition 字段当消息发送到分区主题时由于SendReceipt命令只包含 ledger ID 与 entry ID消息 ID 的partition字段始终为 -1。2.5.2 为ProducerImpl增加partition字段并在ackReceived方法中用它填充消息 ID 的 partition 字段使客户端能够从回调中获知消息实际落到的分区。Pulsar FunctionsAsync 模式、本地运行与 SerDe 校验支持 Async 模式2.5.2 为 Pulsar Functions 引入异步Async模式支持。此前形如下面的函数无法被支持FunctionI, CompletableFutureO这类函数在 Pulsar Functions 需要通过 RPC 调用外部系统时非常有用——函数无需阻塞等待外部系统响应而是返回CompletableFuture由运行时在异步结果就绪后继续处理。2.5.2 之后用户可以直接编写异步函数来对接外部服务提升吞吐并降低线程占用。修复 localrunner 的 Netty 依赖问题在将pulsar-functions-local-runner作为依赖引入并本地运行 Pulsar Functions 时此前会出现 Netty 库缺失、类找不到的问题。2.5.2 为 pulsar-functions-local-runner 增加了一个 Log4j2 配置文件默认将日志输出到控制台便于定位此类依赖缺失问题。修复 Pulsar Functions 更新的 SerDe 校验此前更新 Pulsar Function 时错误地使用outputSchemaType字段来校验参数而实际上应当使用outputSerdeClassName参数。2.5.2 修正了该校验逻辑保证更新操作按正确的序列化类名进行参数校验。分层存储与 IO 连接器避免 offload 到 HDFS 时预取过多数据将数据 offload 到 HDFS 时如果预取pre-fetch过多数据可能引发严重 OOM。2.5.2 引入managedLedgerOffloadPrefetchRounds用于设置 offload 读取 ledger 时的最大预取轮数。该参数既可作为 broker 配置也可纳入 offload 策略见 OffloadPoliciesImpl.java 中的managedLedgerOffloadPrefetchRounds字段运维人员可按需调低以控制内存峰值。JDBC sink 正确处理 schema 中的 null 字段此前 JDBC sink 无法处理 null 字段当 Pulsar 中注册的 schema 允许 null、且 MySQL 表存在同名列但消息未携带该字段时会抛出异常。2.5.2 中 JDBC sink 改用setColumnNull方法将 null 字段值正确写入数据库行避免异常并如实反映字段为空的状态。版本升级与获取本文所述特性与修复均以 2.5.2 为基准。升级部署时请重点核对以下配置项的取值配置项默认值说明retentionCheckIntervalInSeconds120检查已消费 ledger 是否需要裁剪的间隔秒数0 或负数表示不检查managedLedgerOffloadPrefetchRounds见DEFAULT_OFFLOAD_MAX_PREFETCH_ROUNDSoffload 读取 ledger 的最大预取轮数autoTopicCreationOverride无命名空间 policy命名空间级覆盖 broker 的自动建 Topic 设置以上配置均在conf/broker.conf或通过pulsar-admin命名空间策略下发升级时建议结合官方 release notes仓库中对应条目位于 release-notes 相关页面逐项核对影响面。对于生产环境尤其建议优先关注 Netty 安全升级、无流量 retention 清理与 ZooKeeper 缓存失效三项变更它们分别对应安全、存储与稳定性三个关键维度。【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询