2020 年 04 月 23 日,Apache Pulsar 正式发布了 2.5.1 版本。

 

Apache Pulsar 2.5.1 版本合并了社区的 131 个 PR,修复了大量漏洞,涵盖 Broker、客户端、Pulsar Functions、connectors 等,进一步丰富和完善了 Pulsar 作为一个云原生流数据平台的能力。

 

在这篇文章中,我们将会为大家详细解读 2.5.1 中修复、改进的特性。

 


 

 

01 漏洞修复

 

Broker

 

  • 修复在禁用自动创建 topic 的时候,在 partitioned topic 上创建 consumer。[PR-5572]

     

  • 修复 consumer 统计数据中的 negative unack 的消息。[PR-5929]

     

  • 修复无法创建或更新包含 global 的集群的租户。[PR-6275]

     

  • 当 topic 名称与分区名称一致时,避免获取分区元数据。[PR-6339]

     

  • 支持使用现有 topic 名称的 substring 创建分区 topic。[PR-6478]

     

  • 修复因运行 topic compaction 导致的内存泄露问题。[PR-6485]

     

  • 解决在 batch 模式下创建 topic 时,Admin 的`getLastMessageId` 无法获取 `batchIndex` 的问题。[PR-6511]

     

  • 修复无法将只包含一个分区的 topic 升级成为包含多个分区的 topic 问题。[PR-6560]

     

  • 修复 putShema() 运行中产生的 `BadVersionException` 异常情况。[PR-6683]

     

  • 在 `Policies` class 中,重新启用 `clusterDispatchRate` 字段,用于设置 topic-level 排空速率,以便实现新老版本的兼容性。[PR-6176]

     

  • 在 broker.conf 文件中显示 BookKeeper `explicit lac` 的配置信息,以便用户使能 `explicitLacInterval`,获取 Pulsar SQL 中的最新消息。[PR-5822]

     

  • 支持在命名空间使能或禁用消息延迟发送的功能。[PR-5915]

     

  • 避免在现有的分区 topic上创建同名的 regular topic。[PR-5943]

     

  • 修复 cursor 重置问题,避免出现 `InvalidCursorPosition Exception` 问题。[PR-6120]

     

  • 修复 BrokerService 中的 Timeout API 调用,为在 BrokerService 中创建的所有 futures 设置 deadline。[PR-6235]

     

  • 修复 `PersistentTopicsBase` 的一些 async 方法问题。[PR-6483]

 

 

Pulsar Proxy

 

  • 修正 Pulsar proxy 线程执行器名称。[PR-6460]

     

  • 修复已发布消息的日志问题。[PR-6474]

     

  • 修复 Pulsar proxy 到 Functions worker 的路由问题。[PR-6486]

 

 

Stats & Monitoring

 

  • 在 `topicStats` 中添加 `backlogSize`。[PR-5914]

     

  • 在 consumer 统计信息中,显示 `lastConsumedTimestamp` 和 `lastAckedTimestamp` 信息。[PR-6051]

     

  • 改进 Topic 中 backlogSize 的统计。[PR-6700]

 

 

Security

 

  • 修复发布 buffer 限制不生效的问题。[PR-6431]

     

  • 修复 `authenticationData` 无法初始化的问题。[PR-6440]

     

  • 为二进制连接验证 token。[PR-6233]

     

  • 修复在 Standalone 模式下使能 TLS 后,namespace 创建失败的问题。[PR-6457]

     

  • 为 topic 提供更多颗粒度许可。[PR-6504]

 

 

Pulsar Schema

 

  • 修复在 `HttpLookupService` 获取 schema 版本问题。[PR-6193]

     

  • 为 topic 生成的 consumer 设置独立的 schema。[PR-6356]

     

  • 修复错误的 Avro schema。[PR-6406]

     

  • 修复 Functions 中 Avro scheme 解码错误问问题。[PR-6662]

     

  • 为 `SchemaDefinitionBuilderImpl.java` 添加验证。[PR-6405]

 

 

Pulsar Functions

 

  • 修复 Window Functions 部署问题。[PR-6246]

     

  • 在 `PulsarSinkEffectivelyOnceProcessor` 中移除 `future.join()` 参数。[PR-6361]

 

 

Java client

 

  • 修复即使当队列值设置为 0 时,可用的 permit 值大于 1 的问题。[PR-6106]

     

  • 修复 broker 客户端 TLS 设置错误问题。[PR-6128]

     

  • 修复当为 batch topic 启动 reader 时,reader 读取 batch topic 中的第一条消息的问题。[PR-6345]

     

  • 修复 `hasMessageAvailable()`。[PR-6362]

     

  • 删除重复的 key,以便发送属性。[PR-6390]

     

  • 修复由于两次调度发现任务,而导致 multitopic 发现终止的问题。[PR-6407]

     

  • 修复发送失败时的 deadlock 问题。[PR-6488]

     

  • 删除重复的 `cnx` 方法。[PR-6490]

     

  • 使用 `System.nanoTime()` 计算运行时间。[PR-6454]

 

 

C++ client

 

  • 修复 MacOS 平台上 C++ 库的静态链接问题。[PR-5581]

     

  • 修复 ExecutorService destructor 的内存损坏问题。[PR-6270]

     

  • 修复 NegativeAcksTracker 如何处理已取消的定时器事件问题。[PR-6272]

     

  • 修复当 Pulsar 客户端关闭时可能产生的 deadlock 问题。[PR-6277]

     

  • 修复在 Windows 平台上搭建 CMake 时遇到的问题,主要包括为与 Windows 版本相匹配的 zlib、protobuf、curl 库提供更多库名。[PR-6336]

     

  • 利用时间分区修复 `UnAckedMessageTracker` 问题。将 `acktimeout` 划分为几个时间分区,这样用户就可以定义再发送周期。[PR-6391]

     

  • 修复将已确认消息作为未确认消息再次发送的问题。由于将 `acktimeout` 划分为几个时间分区,一些已确认消息作为未确认消息会被再次发送。[PR-6498]

     

  • 当消息列表为空时,避免调用 `redeliverMessages()`,否则导致立即发送所有未确认消息。[PR-6480]

     

  • 在 Debian 或 RPM 中再提供一个 `libpulsarwithdeps.a`,以避免安全问题。[PR-6458]

 

 

Python Client

 

  • 修复无法找到 enum34 包的问题。[PR-6401]

     

  • 支持在 Python 3.8上安装 Pulsar 客户端。[PR-6741]

 

 

Pulsar Websocket

 

  • 修复 WebSocket 无法设置正确的集群数据的问题。[PR-6102]

 

 

Kubernetes

 

  • 在 `values-mini.yaml` 文件中,明确说明 `BOOKIE_MEM` 和 `BOOKIE_GC`。[PR-6340]

     

  • 将自动修复特性的 configmap 中的 `PULSAR_MEM` 改为 `BOOKIE_MEM`,解决执行自动修复时,提示的 `could not find or load main clas` 问题。[PR-6373]

     

  • 在 `proxy-deployment.yaml` helm 模版中,定义一个新的 init container,解决因未启动 Broker 就启动 proxy 带来的 HTTP 403 问题。[PR-6158]

     

  • 为 dashboard-ingress 添加缺失的检查。[PR-6160]

     

  • 确保为 Bookie 设置了 JVM 内存和 GC 选项。[PR-6201]

     

  • 修复运行 Kubernetes 时,使用缺省 `functionAuthProvider` 的问题。[PR-6203]

 

 

Adaptors

 

确保总是可以从缓存中获取已启动的 Pulsar 客户端。当缓存中的 Pulsar 客户端被关闭后,PulsarConsumerSource 重用 Pulsar client 时会产生异常情况并不断报错。[PR-6436]

 


 

02 优化改进

 

Broker

 

  • 支持从 broker 缓存中移除已关闭的 producer,以便创建新的 producer,并有助于避免消息发布失败。[PR-5988]

     

  • 支持删除已被读取所有信息,且没有活跃的 producer 或 consumer 的 topic。[PR-6077]

     

  • 添加一条信息,用以说明在启动组件时如何立即刷新日志。[PR-6078]

     

  • 支持将资源利用率输出至日志。[PR-6152]

     

  • 引入 maxMessagePublishBufferSizeInMB 配置,避免 broker 内存溢出(OOM)。[PR-6178]

     

  • 配置 `getNumberOfEntriesInBacklog(boolean isPrecise)`和 `msg_backlog_non_delayed` 参数,获取 backlog 的准确数量和不包含延迟消息的 backlog 的数量。[PR-6310]

     

  • 当禁用自动创建 topic 功能时,不允许 Admin 自动创建订阅。[PR-6685]

 

 

ZooKeeper

 

  • 支持在为 partitioned topic 创建分区时,在本地 ZooKeeper 创建受管 ledger 路径。[PR-6189]

     

  • 将 ZooKeeper 升级至 3.5.7 版本。[PR-6329]

     

  • 支持在取消调用发生异常的 `Future` 之前,关闭 ZooKeeper。[PR-6399]

 

 

Client

 

  • 将 `BatchMessageIdImpl` 的 `acker` 参数设置为 `transient`,避免其打破序列化。[PR-6064]

     

  • 使用 `JSONAssert` 参数并修改相关的 JSON 测试断言,以便提供更稳定的测试。[PR-6247]

 

 

Managed Ledger

 

  • 增加 `OpAddEntry` 状态设置,避免不同的 ledger handle 使用同一个 OpAddEntry。[PR-5942]

 

 

Pulsar Admin

 

  • 允许租户管理员管理订阅权限。[PR-6122]

 


 

03 下载链接

 

 

  • Pulsar 2.5.1 的下载链接:
    https://pulsar.apache.org/download/

     

  • Pulsar 项目链接:
    https://pulsar.incubator.apache.org/

     

  • Pulsar GitHub 代码库:
    http://github.com/apache/pulsar

     

  • Pulsar Slack channel:
    https://apache-pulsar.herokuapp.com/

     

  • Pulsar 邮件列表:
    https://pulsar.incubator.apache.org/contact/