Apache Pulsar 2.7.3 最新进展
近期,Apache Pulsar 社区发布了 Pulsar 2.7.3 版本!新版本涵盖 32 位贡献者提供的改进和错误修复,并提交了 79 次变更。
版本亮点:
本博客介绍了 2.7.3 版本最值得关注的进展,如需了解所有性能升级和 bug 修复的完整列表,请查阅 Pulsar 2.7.3 发布注记。
Bug 修复和性能升级
Broker
PR-9826: 游标读取遵循调度字节率限制器的限制。
- 问题: 无论是命名空间还是主题策略在限制分发速率时都未考虑使用字节速率限制。
- 解决方案: 修复了调度字节速率限制器设置的行为。游标读取会遵循此设置并且不会在导致意外的结果。
PR-11226: Ledger 滚动计划任务按照预期执行。
- 问题: 在此 PR 之前,ledger 在达到最大滚动时间之前执行滚动任务,导致 ledger 不能及时滚动。
- 解决方案: 修复 ledger 滚动调度的时间,任务只能在 ledger 成功创建之后运行。
PR-11136: 在重启 broker 时,主题级别的保留策略能正常工作。
- 问题: 在此 PR 之前,当为一个 topic 设置 topic 级保留策略然后重启 broker 时,该 topic 级别的保留策略不生效。
- 解决方案: 修正了此策略的行为,使其在启动
policyCacheInitMap
后重放所有策略消息,并在重新启动 broker 时添加了保留策略检查测试。
PR-10977: 调用 lastMessageId API 不会再导致内存泄露。
- 问题: 在此 PR 之前,调用
lastMessageId
时存在内存泄露,导致 broker 进程被 Kubernetes 停止。
- 解决方案: 为
PersistentTopic.getLastMessageId
增加了缺失的 entry.release() 调用,以确保 broker 不会耗尽内存。
PR-10594: ZooKeeper 读取由 broker 缓存。
- 问题: 当执行管理操作以获取租户的命名空间时,是 ZooKeeper 使用在 ZooKeeper 客户端读取的, 而不是从broker 缓存中读取。
- 解决方案: 修复 ZooKeeper 在为租户获取命名空间列表时的缓存问题。
PR-10512: 调用 LeaderService.isLeader()
的监控线程不再被阻塞。
- 问题: 当
LeaderService
改变为 leadership 状态时,会被一个 synchronized
块锁定,这也阻止了其他线程调用 LeaderService.isLeader()
。
- 解决方案: 通过修改
ClusterServiceCoordinator
和 WorkerStatsManager
以检查其是否来自 MembershipManager
的 leader ,修复了监控线程的死锁条件,使其不被 LeaderService.isLeader()
阻塞。
PR-10414: hasMessageAvailable
可以成功读取消息。
- 问题: 因消息被
acknowledgmentsGroupingTracker
过滤,当 hasMessageAvailableAsync
返回 true
时无法读取消息。
- 解决方案: 通过修改
acknowledgmentsGroupingTracker
过滤重复消息,并在之后连接打开时清理消息来修复竞争条件。
Proxy
PR-8048: Proxy 支持自动创建分区 topic。
- 问题: Proxy 因使用的是当前的 ZooKeeper 元数据而没有创建分区。
- 解决方案: 通过从可用 broker 中选择和获取,而不是使用当前的 ZooKeeper 元数据来更改 proxy 以处理
PartitionMetadataRequest
。
Pulsar admin
PR-11140: 增加标识来表明是否在复制的集群上创建元数据路径。
- 问题: 在复制的命名空间上创建分区 topic时,没有在复制的集群上创建元数据路径
/managed-ledgers
。
- 解决方案: 增加了一个标识(createLocalTopicOnly),用来表明是否为复制集群中的分区 topic 创建元数据路径。
PR-11131: 禁止为不存在的 topic 设置策略。
- 问题: 由于 topic 策略中存在重定向循环,用户可以为不存在的 topic 或者已分区的 topic 设置策略。
- 解决方案: 此项修复为 topic 策略增加了一个权威标识,以避免重定向循环。用户无法为不存在的 topic 或单分区 topic 的分区设置 topic策略。如果你为 0 分区 topic 的分区设置策略,它会重定向到 broker 。
PR-10806: 服务发现不再将 topic 硬编码为持久性。
- 问题: 当对分区的非持久 topic 使用查找服务发现时,就会返回 0 而不是分区数。Pulsar 客户端会以连接普通 topic 的方式尝试连接到该 topic。
- 解决方案: 实现
topicName.getDomain().value()
而不是硬编码 persistent
。现在用户可以成功地对一个分区的非持久 topic 使用服务发现。
PR-10744: 其他连接器现在可以使用 Kinesis Backoff
类
- 问题: Pulsar 客户端实现项目中的 Kinesis sink 连接器
Backoff
类结合依赖 org.apache.pulsar:pulsar-client-original
增加了连接器的大小。
- 解决方案: 在函数 io-core 项目中增加了一个新的类
Backoff
,以便 Kinesis sink 连接器和其他连接器可以使用此类。
客户端
PR-10506: 无法发送许可为零的 FLOW
请求。
- 问题: 当 broker 接收到一个零许可的
FLOW
请求时,会抛出异常并且关闭连接。这会引发频繁的重连,并导致重复或者乱序的消息。
- 解决方案: 增加了一个在发送
FLOW
请求之前验证其许可的验证功能,如果请求是零许可,则不能发送 FLOW
请求。
函数和连接器
PR-10769: Kinesis sink 连接器确认成功的消息。
- 问题: Kinesis sink 连接器在发送成功后没有确认消息。
- 解决方案: 为 Kinesis sink 连接器增加了消息发送成功后的确认。
Docker
PR-10531: 在使用 Kubernetes 运行时,Function 名称不能超过 52 个字符。
- 问题: 当使用 Kubernetes 运行时,如果提交的 function 长度有效(小于 55 个字符),就会创建一个无法产生 pod 的 StatefulSet。
- 解决方案: 将 Kubernetes 运行时的 function 名称的最大长度从 55 个字符改为 53 个字符。通过这一修复, function 名字的长度不能超过 52 个字符。
依赖
PR-10907: 启动 TLS 后,pulsar-admin
与 proxy 的连接稳定了。
- 问题: 因为 Jetty 9.4.39 中引入了 SSL 缓存的错误,
pulsar-admin
在 TLS 连接中不稳定,导致大型 function jar 包上传频繁失败。
- 解决方案: 将 Jetty 升级到 9.4.42.v20210604,这样当启用 TLS 时,
pulsar-admin
与 proxy 的连接是最稳定的。
参与其中
欢迎大家下载并使用新版本!如果在使用中遇到问题,可以通过提 issue 的方式抛出疑问并与社区交流。