本文翻译自 StreamNative 博客《What’s New in Apache Pulsar 2.10》,作者为李鹏辉、Dave Duggins,原文地址为 https://streamnative.io/blog/release/2022-05-12-whats-new-in-apache-pulsar-210/。
倍受期待的 Apache Pulsar 2.10.0 版本近期已发布!新版本涵盖 99 位贡献者提供的改进和错误修复,并提交了 800 余次变更。除了之前为大家介绍的减轻 ZooKeeper 依赖 和自动化集群故障转移 特性外,Pulsar 2.10.0 版本还包含十余项重大特性的更改。本博客为你浓缩了 Pulsar 2.10.0 版本发布亮点,一起来看看新版本还有哪些值得关注的特性吧,方便开发者和用户参考。
版本亮点:
-
• PR-13316:在主集群和备份集群之间提供自动故障恢复。(原 PIP:PR-13315[1])
-
• PR-10279:通过向
PartitionedProducer
添加延迟加载功能,仅需更少的生产者即可更有效地使用 broker 内存。 -
• PR-12838:通过接收到的消息中的键值,使用新的
TableView
类型添加主题映射支持。
本博客按项目功能更新情况分组,介绍了 2.10.0 版本最值得关注的进展,如需了解所有性能升级和 bug 修复的完整列表,请查阅 Pulsar 2.10.0 发布注记[2]。
Bug 修复和功能增强
客户端(仅 Java Client 支持)
PR-13316: 实现客户端上的 Pulsar 集群级自动故障转移。
问题:Pulsar 管理员必须手动对集群进行故障转移。
解决方案:添加 Pulsar 集群级别的自动故障转移功能。当检测到故障转移事件时,它会自动无缝地从主集群切换到一个或多个辅助集群;当主集群恢复时,客户端会自动切换回来。
PR-12517: 支持设置跨多个集群的主题策略。
问题:主题策略只对本地集群生效
解决方案:增加支持设置可以应用给多个集群的主题策略。
-
• 为本地主题策略设置消息的
replicateTo
属性以避免被复制到远程。 -
• 留存支持设置全局参数。
-
• 为
SystemTopicBasedTopicPoliciesService
添加全局主题策略。
生产者
PR-10279: 为分区生产者添加延迟加载功能。
问题:分区数量是根据最高速率生产者设置的,最低速率生产者并不总是需要连接到每个分区,因此额外的生产者会占用 broker 内存。
解决方案:通过为分区生产者引入延迟加载,减少生产者数量以更有效地使用 broker 内存;添加轮询路由模式类来限制分区的数量。
PR-12403: 引入 chunk message ID。
问题:发送分块消息时,生产者返回最后一个分块的 message-id 会导致某些进程出现错误。
解决方案:引入了新的 ChunkMessage-ID
类型。为继承自 MessageIdImpl
的 chunk message-id 增加了两个新方法:getFirstChunkMessageId
和 getLastChunkMessageID
。对于其他方法实现,直接调用 lastChunkMessageID
,兼容现有的业务逻辑。
Broker
PR-12536:扩展 broker,为企业级集群的运维人员提供更多可控性和灵活性。
问题:企业级 Pulsar 集群运维人员需要更大的灵活性和控制力来拦截 broker 事件(包括 ledger 写入/读取),以进行模板验证、可观测性和访问控制。
解决方案:
-
• 增强 org.apache.pulsar.broker.intercept.BrokerInterceptor 接口以包含用于跟踪的附加事件
-
• 创建了一个新接口 org.apache.pulsar.common.intercept.MessagePayloadProcessor,允许拦截 ledger 读写操作
消费者
PR-10478:重新投递命令添加 epoch。
问题:在旧版本中,拉取和重新投递的操作是异步的,因此客户端消费者可能会收到一条新消息,并根据新的 messageID 执行累积 ack 且无法消费旧消息。
解决方案:Pulsar 客户端通过服务器和客户端消费者的增量 epoch 来同步重新投递和拉取消息操作。
PR-12269:支持 Dispatcher 中的可插入 Entry 过滤器。
问题:旧版本不支持原生消息标记。
解决方案:在 broker 级别实现 Entry 过滤器框架,并在后续即将发布的版本中支持命名空间和主题级别。
PR-13355:在向死信队列发送消息之前创建初始化订阅。
问题:无需命名空间的数据留存策略或死信队列订阅,未处理消息中的死信队列数据即会自动删除。
解决方案:在向死信队列发送消息之前创建初始订阅。当 deadLetterProducer
初始化时,消费者根据 DeadLetterPolicy
设置初始订阅。
PR-13707:为确认超时添加重新投递退避策略。
问题:在 PIP-106[3] 中引入的重新投递退避策略仅适用于否定确认 API。如果使用 ack 超时而不是否定确认 API 来触发消息重新投递,则绕过退避策略。
解决方案:
-
• 为确认超时添加消息重新投递策略。
-
• 向
RedeliveryBackoff
添加警报NegativeAckBackoff
接口。 -
• 在
ConsumerBuilder
中暴露AckTimeoutRedeliveryBackoff
。
PR-13599:(目前修改仅涵盖 Java 客户端)解决设置主题级别 maxMessageSize 时产生分块消息失败的问题。
问题:在旧版本中,如果主题级别 maxMessageSize 设置为 [1],则分块消息生成失败。
解决方案:在 PublishContext
中添加 isChunked
。如被分块,则跳过 maxMessageSize
检查。
Function
PR-13205:Pulsar Functions 预加载和释放外部资源。
问题:外部资源初始化和释放或手动完成,或通过使用复杂的初始化逻辑完成。
解决方案:引入 RichFunction
接口,通过提供 setup 和 tearDown API 来扩展 Function
。
PR-12104:更新身份验证接口来包含异步身份验证方法。
问题:Pulsar 当前的 AuthenticationProvider 接口只暴露了用于验证连接的同步方法。在没有任何依赖网络调用的提供商的情况下,目前功能虽足够使用,但是在某些情况下查看 OAuth2.0 规范时,需要网络调用来验证 token。
解决方案:
AuthenticationProvider
-
• 添加
AuthenticationProvider#authenticateAsync
。引入一个调用认证方法的默认实现。 -
• 弃用
AuthenticationProvider#authenticate
。 -
• 添加
AuthenticationProvider#authenticateHttpRequestAsync
。 -
• 弃用
AuthenticationProvider#authenticateHttpRequest
。
AuthenticationState
-
• 添加
AuthenticationState#authenticateAsync
。 -
• 弃用
AuthenticationState#authenticate
并推荐使用AuthenticationState#authenticateAsync
方法。 -
• 弃用
AuthenticationState#isComplete
。可以通过从AuthenticationState#authenticateAsync
的结果推断身份验证完整性来避免此方法。
AuthenticationDataSource
-
• 弃用
AuthenticationDataSource#authenticate
。不需要此方法的异步版本。
PR-12838:初始化 TableView 提交。
问题:在许多场景中,应用程序使用 Pulsar 消费者或 reader 从主题中获取所有更新,并使用接收到消息的每个键的最新值构造一个映射。这个操作在构建数据的本地缓存时很常见。社区不提供对 Pulsar 客户端 API 中未包含此访问模式的支持。
解决方案:添加新的 TableView
类型并更新 Pulsar Client。
主题
PR-12818:支持主题元数据(第一部分)——创建具有属性的主题。
问题:无法存储主题元数据。
解决方案:
-
• 在 topics.java 中添加新的存储方法。
-
• 添加两个新的 REST API 路径以减少兼容性问题。
元数据存储
PR-13225:添加了 Etcd MetadataStore 实现。
问题:社区正在努力添加支持非 ZooKeeper 实现的元数据后端。
解决方案:添加对以下的 Etcd 支持:
-
• 批处理读/写请求
-
• 会话监视点
-
• Lease manager
本文转载自StreamNative,原文链接:https://mp.weixin.qq.com/s/cpVnG654TnHzQvDpcvsx1w。