Apache Pulsar 2.4.2 版本说明
December 4, 2019

2019 年 12 月 04 日,Apache Pulsar 发布了 2.4.2 版本。
2.4.2 版本合并了社区的 110 个 PR,修复了大量漏洞,覆盖 Broker、客户端、Pulsar Functions 和 connectors 等,进一步丰富和完善了 Pulsar 作为一个云原生流数据平台的能力。
以下是 2.4.2 版本的详细信息。
漏洞修复
Broker
- 修复了在 asyncReplayEntries 触发 callback 之后,没有返回 empty result 的问题。[PR-5500]
- 修复了在并发场景下,PersistentDispatcherMultipleConsumers 存在的竞态问题。[PR-5499]
- 修复了当用户使用自定义的 auth-provider 时出错的问题。 [PR-5462]
- 修复了由于 NPE 导致的 namespace policies 设置不生效的问题。[PR-5408]
- 修复了由于 messagesToRedeliver 的竞态条件,导致无法读取更多的 entries 的问题。[PR-5391]
- 修复了在 addConsumer 中潜在的死锁问题。[PR-5371]
- 在 proxy 中增加 request body 的 cache,确保请求能够被重新发送到 proxy。[PR-5361]
- 修复了当数据写入 BookKeeper 失败时,需等待 10s 后才创建新 ledger 的问题。[PR-5322]
- 当前,如果在创建 producer/consumer 时,broker 会通过 zkCache 中所记录的 namespace 策略尝试给它们授权,但是,如果从 zk-node 中读取数据超时,zk-cache 将会处于 5 分钟左右的 pending 状态,这导致在此期间,client 将无法在该 topic 上继续创建新的 producer/consumer。2.4.2 版本修复了此问题。[PR-5298]
- 修复了在 ack timeout 到期后,触发 broker 重新发送消息时存在的数据竞态问题。[PR-5276]
- 修复了消息去重时可能导致的消息重复状态不确定的场景下,错误未被正确处理的问题。[PR-5243]
- 修复了在多线程场景下,可能会同时更改 brokerToNamespaceToBundleRange 这个 map,如果出现 NPE,可能导致查询 namespace 下的 bundle 出错。[PR-5191]
- 修复了在 Failover 的订阅模式下,如果执行 reset cursor 会造成消息无法被再次正确分发的问题。[PR-5185]
- 修复了 broker 在开启 TLS 的情况下,与 Functions Worker 一起启动时出错的问题。[PR-5151]
- 修复了 reset cursor 可能导致的死锁问题。[PR-5136]
- 修复了在没有订阅的情况下,storage size 的值总是为 0 的问题。[PR-5108]
Pulsar Functions
- 修复了 connectorsManager 在 WorkerService 中重复初始化的问题。[PR-5545]
- 修复了在 FunctionRuntimeManager 初始化阶段,functions 不必要地重新启动。这会影响外部调度程序调度 Functions,例如:bernetes。 [PR-5527]
- 修复了在创建 Functions 的过程中,使用
--output-serde-classname
选项时,functionClassLoader 不能被正确设置的问题。[PR-5357]
- 修复了当从 state function 中查询一个不存在的 key 时,导致的 NullPointerException 的问题。[PR-5272]
- 修复了在使用不同 classloaders 加载 function instance 时, window functions 可能被阻塞的问题。[PR-5117]
Java Client
- 修复了在 Java Client 中捕获 interrupt 异常后需要再次设置 interrupt 标志的问题。[PR-5643]
- 修复了数据到期后由于连接 readers 而被删除的问题。[PR-5621]
- 修复了在使用 REST API 获取 non-persistent topics 时,会显示 persistent topics 的问题。[PR-5502]
- 修复了 UnAckedMessageTracker 中由于参数错误导致 “3600 messages have timed-out” 的问题。 [PR-5477]
- 修复了在序列化单挑 batch message 中可能导致的 OOM 问题。[PR-5443]
- 修复了在 batch 启用时,发送大消息时会导致 producer 被阻塞的问题。[PR-5282]
- 修复了用户设置 initial backoff delay 和 max backoff delay 不生效的问题。[PR-5261]
Cpp Client
- 修复了 negative ack tracker 不能按照给定的初始化顺序进行初始化的问题。[PR-5453]
- 修复了关闭 producer 时bad_weak_ptr 导致的错误。[PR-5315]
- 修复了 ClientConnection 中的析构函数没有正确被执行导致的内存泄漏问题。[PR-5286]
- 修复了在 mac OS 系统中 Cmake build 出错的问题。[PR-5263]
- 修复了 deadline_timer 持有对象引用导致的内存泄漏问题。[PR-5246]
Python Client
- 修复了 Python API create_reader 选项中 typo 错误导致 reader 创建失败的问题。[PR-5487]
Go Client
- 修复了官网缺少 Go Client 相关接口文档的问题。[PR-5595]
Schema
- 修复了在 Protobuf Schema 下, schema def 构建错误的问题。[PR-5569]
- 修复 StringSchema 静态初始化时的顺序问题。[PR-5445]
Connectors
- 修复了 pulsar-spark 中,receive 忽略了大部分 ConsumerConfiguration 选项的问题。[PR-5152]
优化改进
Broker
- 提高延迟消息中 tracker 的效率来避免比预期更频繁的调度计时器。[PR-5498]
- 在消息分发过程中,“删除标记”之前的消息不会被重新分发。[PR-5378]
- 确保 skip-all command 能够跳过所有的消息。[PR-5375]
- 在用户元数据信息被附加到一个 block 中时,如果用户没有同时指定 region 和 endpoint, offload 的操作将会抛出异常。在 2.4.2 中,使用空 string 串来代替 null,确保 offload 可以正常进行。[PR-5355]
- 在分层存储中,只有在读取不到期望的 entry 时,才会进行 seek 操作。[PR-5356]
- 如果 cursor 未被持久化,那么当所有 consumers 关闭时,订阅将会被 close 并且会从所在的 topic 中移除。在这种情况下,我们需要将 dispatcher 一同关闭,否则 RateLimiter 并不会被垃圾回收,从而造成内存泄漏。[PR-5340]
- 默认情况下,禁用 stickyRead 相关的功能。[PR-5321]
- 避免往一个 read-only 的 cursor ledger 中 append 数据。[PR-5297]
- 当订阅类型改变时,关闭之前的调度器。[PR-5288]
- 提高 effectively once 错误处理的逻辑。[PR-5271]
- 升级 security 相关的依赖。[PR-5232]
- 允许使用正则表达式来删除 topic。[PR-5230]
- 在订阅失败后,确保 consumer 相关的后台资源被关闭。[PR-5204]
- 允许配置 BookKeeper 中 region-aware placement 相关的配置项。[PR-5100]
- DeleteBookieRack 方法应该从 ZooKeeper 中删除 rack 相关的信息。 [PR-5084]
- 如果 ZkBookieRackAffinityMapping 无法解析网络的位置信息时,不进行返回 DEFAULT_RACK 的操作。 [PR-5067]
- 取代之前同步加载的方式,使用异步的方式从 cache 中重新加载 zk,这不会影响重新加载的顺序,避免死锁。 [PR-5049]
- 当 cursor 读取的位置小于 LastIndividualDeletedRange 时,已经确认的消息将不会被发送。 [PR-4987]
- 从连接器中删除过时的 failed-producer。[PR-4741]
- 在 non-partition topic 中,确保 Failover 的订阅类型能够选举出活跃的 consumer。[PR-4604]
Java Client
- 对外暴露一些常用的 ManagedLedger 中的方法。[PR-5472]
- 在开启 batch 的情况下,当 publish 消息失败时,避免内存泄漏。 [PR-5442]
- 为 partitioned topic 添加 seek by time 的接口。 [PR-5435]
- 确保获取 namespace 的 topics 列表使用异步的方式进行处理。 [PR-5188]
- 在 consumerImpl 中将 getLastMessageId 的接口暴露给用户使用。 [PR-4911]
Cpp Client
- 在 cpp client 中,支持延迟消息相关的功能。 [PR-5317]
Python Client
- 在 create_reader 中添加 is_read_compacted 接口。[PR-5483]
- 在 python client 中支持 Key_Shared 的订阅类型。[PR-5196]
Pulsar-Perf
- 记录消息失败的原因,避免 publish 消息出错的情况下,进程退出。[PR-5441]
- 在 Pulsar-Perf 中,允许用户配置多个线程来执行 perf-producer。[PR-5036]
Pulsar Functions
- 在使用 querystate 时,如果没有指定 key,则抛出错误。[PR-5145]
Connectors
- 为 Pulsar Sinks 添加
--subs-position
选项,支持用户从 latest 或者 earliest 的位置消费数据。[PR-5532]
- 在 connectors 官方下载地址中,未正确生成 Flume、Solr 和 Redis 的 connectors 下载地址。在 2.4.2 中,将配置信息添加到 io.xml 确保下载链接可以正确生成。[PR-4999]
Schema
- 支持获取 keyValueSchema 相关的信息。[PR-4877]
- 支持获取 partition topic 中 schema 相关的信息。[PR-4751]
相关链接
下载 Pulsar 2.4.2.
期待你的参与和贡献!.