译者简介

许伟,西北工业大学,航天科工软件开发工程师,开源社区爱好者。本文由 StreamNative 组织翻译与校对。

Apache Pulsar 社区发布 2.9.3 版本!53 位贡献者提交了 200 余次变更,为社区的改进和错误修复贡献了一份力。感谢你们的所有贡献!

2.9.3 版本的亮点是引入了 30 多个事务功能相关的修复和改进。Pulsar 事务的早期用户记录了他们在生产环境中长期使用该功能的情况,并报告了在实际应用中的宝贵实践经验。Pulsar 社区得以优化相关功能特性。

本博客将介绍最重要的变更。有关功能增强和漏洞修复的完整列表,请查看 Pulsar 2.9.3 发行说明。欢迎大家下载并试用[1] Pulsar 2.9.3。

显著的增强和错误修复

1.启用游标数据压缩以减少持久化游标数据大小。PR-14542[2]

问题

游标数据由 ZooKeeper/Etcd 元数据存储管理。当数据大小增加时,可能会花费很多时间来拉取数据,同时 broker 最终可能会将大数据块写入 ZooKeeper/Etcd 元数据库。

解决方案

提供启用压缩机制能力,以减少游标数据大小和拉取时间。

2.减少了 metadataPositions 占用的内存,并避免了内存溢出。PR-15137[3]

问题

MLPendingAckStore 中的 map ​​metadataPositions​​​ 用于清除 PendingAck 中无用的数据,其中 key 是 PendingAck 中持久化的位置,value 是操作确认的最大位置。该参数判断最大订阅游标位置是否小于当前订阅游标的 ​​markDeletePosition​​。如果最大位置更小,则日志游标将打上删除该位置的标记。它将导致以下两个主要问题:

  • • 通常情况下,该 map 存储所有事务的确认操作,这会对存储和 CPU 造成很大的浪费。
  • • 如果一个事务长时间没有提交,确认了它后面一条消息,该 map 不会被清除,最终会导致内存泄漏。

解决方案

按照一定的规则定期存储少量数据。有关更详细的实现,请参考 PIP-153。

3.在将事务 entry 追加到事务缓冲区之前检查 lowWaterMark。PR-15424[4]

问题

当客户端使用先前提交的事务发送消息时,这些消息对消费者可见(非预期)。

解决方案

添加一个 map 将 Transaction Coordinator 的 ​​lowWaterMark​​​ 存储在事务缓冲区中,并在将事务 entry 追加到事务缓冲区之前检查 ​​lowWaterMark​​​。因此,当使用无效事务发送消息时,客户端将收到 ​​NotAllowedException​​。

4.修复了消费性能回归。PR-15162[5]

问题

性能回归在 2.10.0、2.9.1 和 2.8.3 中引入。在使用 Java 客户端时,你可能会发现消息侦听器的性能显着下降。根本原因是每条消息在引入线程时会从外线程池切换到内线程池,最后再到外线程池。

解决方案

避免每条消息的线程切换,以提高消费吞吐量。

5.修复了主题创建的死锁问题。PR-15570[6]

问题

该死锁问题发生在主题创建过程中,在删除它时会尝试从同一个线程重新获取相同的 ​​StampedLock​​。这将导致该主题长时间停止服务,并最终导致数据去重或异地复制检查失败。解决方法是重新启动 broker。

6.优化了 broker 的内存使用。

问题

相比于使用 Boxing 类型,使用 Pulsar 的一些内部数据结构,比如 ​​ConcurrentLongLongPairHashMap​​​ 和 ​​ConcurrentLongPairHashMap​​,可以减少内存使用。但是,在早期版本中,即使删除了数据,也不支持对数据结构进行收缩,这在某些情况下会浪费一定的内存。

Pull requests

  • • https://github.com/apache/pulsar/pull/15354
  • • https://github.com/apache/pulsar/pull/15342
  • • https://github.com/apache/pulsar/pull/14663
  • • https://github.com/apache/pulsar/pull/14515
  • • https://github.com/apache/pulsar/pull/14497

解决方案

支持内部数据结构的收缩,如 ​​ConcurrentSortedLongPairSet​​​、​​ConcurrentOpenHashMap​​ 等。

引用链接

​[1]​​ 下载并试用: ​https://pulsar.apache.org/en/versions/​
​​​[2]​​ PR-14542: ​https://github.com/apache/pulsar/pull/14542​
​​​[3]​​ PR-15137: ​https://github.com/apache/pulsar/pull/15137​
​​​[4]​​ PR-15424: ​https://github.com/apache/pulsar/pull/15424​
​​​[5]​​ PR-15162: ​https://github.com/apache/pulsar/pull/15162​
​​​[6]​​ PR-15570: ​https://github.com/apache/pulsar/pull/15570​