本文原文作者是 StreamNative 工程师丛搏、刘昱。译者刘梓霖,传智教育工程师。

关于 Apache Pulsar

Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。GitHub 地址:http://github.com/apache/pulsar/
近期,Apache Pulsar 社区发布了 Pulsar 2.7.3 版本!新版本涵盖 32 位贡献者提供的改进和错误修复,并提交了 79 次变更。

版本亮点:

• 游标读取遵循调度字节率限制器的设置,不会再导致意外的结果。[1]
• Ledger 滚动任务按预期执行。[2]

本博客介绍了 2.7.3 版本最值得关注的进展,如需了解所有性能升级和 bug 修复的完整列表,请查阅 Pulsar 2.7.3 发布注记[3] 。

Bug 修复和性能升级

Broker

PR-9826[4] : 游标读取遵循调度字节率限制器的限制。

问题:无论是命名空间还是主题策略在限制分发速率时都未考虑使用字节速率限制。

解决方案:修复了调度字节速率限制器设置的行为。游标读取会遵循此设置并且不会在导致意外的结果。

PR-11226[5]: Ledger 滚动计划任务按照预期执行。

问题:在此 PR 之前,ledger 在达到最大滚动时间之前执行滚动任务,导致 ledger 不能及时滚动。

解决方案:修复 ledger 滚动调度的时间,任务只能在 ledger 成功创建之后运行。

PR-11136[6] : 在重启 broker 时,主题级别的保留策略能正常工作。

问题:在此 PR 之前,当为一个 topic 设置 topic 级保留策略然后重启 broker 时,该 topic 级别的保留策略不生效。

解决方案:修正了此策略的行为,使其在启动 policyCacheInitMap 后重放所有策略消息,并在重新启动 broker 时添加了保留策略检查测试。

PR-10977[7]: 调用 lastMessageId API 不会再导致内存泄露。

问题:在此 PR 之前,调用 lastMessageId API 时存在内存泄露,导致 broker 进程被 Kubernetes 停止。

解决方案:为 PersistentTopic.getLastMessageId 增加了缺失的 entry.release() 调用,以确保 broker 不会耗尽内存。

PR-10594[8]: ZooKeeper 读取由 broker 缓存。

问题:当执行管理操作以获取租户的命名空间时,是 ZooKeeper 使用在 ZooKeeper 客户端读取的, 而不是从broker 缓存中读取。

解决方案:修复 ZooKeeper 在为租户获取命名空间列表时的缓存问题。

PR-10512[9]: 调用 LeaderService.isLeader() 的监控线程不再被阻塞。

问题:当 LeaderService 改变为 leadership 状态时,会被一个 synchronized 块锁定,这也阻止了其他线程调用 LeaderService.isLeader() 。

解决方案:通过修改 ClusterServiceCoordinator 和 WorkerStatsManager 以检查其是否来自 MembershipManager 的 leader ,修复了监控线程的死锁条件,使其不被 LeaderService.isLeader() 阻塞。

PR-10414[10]: hasMessageAvailable 可以成功读取消息。

问题:因消息被 acknowledgmentsGroupingTracker 过滤,当 hasMessageAvailableAsync 返回 true 时无法读取消息。

解决方案:通过修改 acknowledgmentsGroupingTracker 过滤重复消息,并在之后连接打开时清理消息来修复竞争条件。

Proxy

PR-8048[11]:Proxy 支持自动创建分区 topic。

问题:Proxy 因使用的是当前的 ZooKeeper 元数据而没有创建分区。

解决方案:通过从可用 broker 中选择和获取,而不是使用当前的 ZooKeeper 元数据来更改 proxy 以处理 PartitionMetadataRequest 。

Pulsar admin

PR-11140[12]:增加标识来表明是否在复制的集群上创建元数据路径。

问题:在复制的命名空间上创建分区 topic时,没有在复制的集群上创建元数据路径 /managed-ledgers。

解决方案:增加了一个标识(createLocalTopicOnly),用来表明是否为复制集群中的分区 topic 创建元数据路径。

PR-11131[13]:禁止为不存在的 topic 设置策略。

问题:由于 topic 策略中存在重定向循环,用户可以为不存在的 topic 或者已分区的 topic 设置策略。

解决方案:此项修复为 topic 策略增加了一个权威标识,以避免重定向循环。用户无法为不存在的 topic 或单分区 topic 的分区设置 topic策略。如果你为 0 分区 topic 的分区设置策略,它会重定向到 broker 。

PR-10806[14]:服务发现不再将 topic 硬编码为持久性。

问题:当对分区的非持久 topic 使用查找服务发现时,就会返回 0 而不是分区数。Pulsar 客户端会以连接普通 topic 的方式尝试连接到该 topic。

解决方案:实现 topicName.getDomain().value() 而不是硬编码 persistent。现在用户可以成功地对一个分区的非持久 topic 使用服务发现。

PR-10744[15]:其他连接器现在可以使用 Kinesis Backoff 类

问题:Pulsar 客户端实现项目中的 Kinesis sink 连接器 Backoff 类结合依赖 org.apache.pulsar:pulsar-client-original 增加了连接器的大小。

解决方案:在函数 io-core 项目中增加了一个新的类 Backoff ,以便 Kinesis sink 连接器和其他连接器可以使用此类。

客户端

PR-10506[16]:无法发送许可为零的 FLOW 请求。

问题:当 broker 接收到一个零许可的 FLOW 请求时,会抛出异常并且关闭连接。这会引发频繁的重连,并导致重复或者乱序的消息。

解决方案:增加了一个在发送 FLOW 请求之前验证其许可的验证功能,如果请求是零许可,则不能发送 FLOW 请求。

函数和连接器

PR-10769[17] :Kinesis sink 连接器确认成功的消息。

问题:Kinesis sink 连接器在发送成功后没有确认消息。

解决方案:为 Kinesis sink 连接器增加了消息发送成功后的确认。

Docker

PR-10531[18] :在使用 Kubernetes 运行时,Function 名称不能超过 52 个字符。

问题:当使用 Kubernetes 运行时,如果提交的 function 长度有效(小于 55 个字符),就会创建一个无法产生 pod 的 StatefulSet。

解决方案:将 Kubernetes 运行时的 function 名称的最大长度从 55 个字符改为 53 个字符。通过这一修复, function 名字的长度不能超过 52 个字符。

依赖

PR-10907[19]:启动 TLS 后,pulsar-admin 与 proxy 的连接稳定了。

问题:因为 Jetty 9.4.39 中引入了 SSL 缓存的错误,pulsar-admin 在 TLS 连接中不稳定,,导致大型 function jar 包上传频繁失败。

解决方案:将 Jetty 升级到 9.4.42.v20210604,这样当启用 TLS 时,pulsar-admin 与 proxy 的连接是最稳定的。

参与其中

新版本使用

欢迎大家下载[20]并使用新版本!如果在使用中遇到问题,可以通过提 issue[21] 或在微信群交流的方式抛出疑问并与社区交流。

加入 Apache Pulsar 社区

Pulsar 项目的成长来源于社区,也扎根于社区。一次次新版本的筹备与发布离不开社区伙伴们的贡献。你是否愿意成为其中的一员呢?

参与开源,可以获得公司及社区内外的认可,结交来自各个领域、志同道合的小伙伴;同时也可以提高个人影响力,促进个人发展。参与开源不是码农的专属,社区、文档等各个方面都可以让大家发挥一技之长。

作为全球性开源项目,截至目前,Apache Pulsar 已拥有 435 名贡献者、9.4K+ Star 、2.3 K+ Fork 。我们为大家提供了参与指南,欢迎越来越多的小伙伴助力 Apache Pulsar 项目的不断发展与前进。

• Apache Pulsar 官方贡献指南[22]

• 加入 Apache Pulsar 志愿者大家庭

译者信息

Hi~ 我叫刘梓霖,一名会 code 的斜杠青年 ~

推荐阅读

•Pulsar 2.8.0 新增特性概览:独占 Producer、事务等
•Apache Pulsar 2.7.1 版本正式发布!
引用链接

[1] 游标读取遵循调度字节率限制器的设置,不会再导致意外的结果。: https://github.com/apache/pul...
[2] Ledger 滚动任务按预期执行。: https://github.com/apache/pul...
[3] Pulsar 2.7.3 发布注记: https://pulsar.apache.org/en/...
[4] PR-9826: https://github.com/apache/pul...
[5] PR-11226: https://github.com/apache/pul...
[6] PR-11136: https://github.com/apache/pul...
[7] PR-10977: https://github.com/apache/pul...
[8] PR-10594: https://github.com/apache/pul...
[9] PR-10512: https://github.com/apache/pul...
[10] PR-10414: https://github.com/apache/pul...
[11] PR-8048: https://github.com/apache/pul...
[12] PR-11140: https://github.com/apache/pul...
[13] PR-11131: https://github.com/apache/pul...
[14] PR-10806: https://github.com/apache/pul...
[15] PR-10744: https://github.com/apache/pul...
[16] PR-10506: https://github.com/apache/pul...
[17] PR-10769: https://github.com/apache/pul...
[18] PR-10531: https://github.com/apache/pul...
[19] PR-10907: https://github.com/apache/pul...
[20] 下载: https://pulsar.apache.org/en/...
[21] 提 issue: https://github.com/apache/pul...
[22] Apache Pulsar 官方贡献指南: http://pulsar.apache.org/en/c...


ApachePulsar
192 声望939 粉丝

Apache软件基金会顶级项目,下一代云原生分布式消息系统