平时在 Pulsar 交流群中,我们发现大家在接触和使用 Pulsar 的过程中,会反复遇到相类似的问题。为了更高效地解决大家这些“高频疑问”,同时也对提出优质问题的朋友表示感谢,我们特别建立了 FAQ 知识库,以便于收集及解答大家的疑问。

我们将定期收集筛选社群内提出的高频问题,由社区专家甄别筛选出其中优质的提问进行回答,整合优化后分享给社区的小伙伴们作为遇到问题时的优先参考,希望可以帮助大家解决使用 Pulsar 过程中的问题。

下面来看看本次收集的问题吧:

Broker 重启、Topic 分配

问题 1:Broker 重启,原来绑定的 Topic 会自动恢复还是会分配到其他 Broker 上?

解答:当生产者/消费者客户端需要继续向某个 Topic 发送/接收消息时,会首先执行 lookup 请求,lookup 会按照 loadbalance 策略找到目标 Broker 节点(当前是 load 最低的节点),将对应 bundle onLoad 到目标 Broker。待 onLoad 完成后,这个 Broker 就可以继续为 Topic 提供读写服务了。

对应的源码为: ServerCnx#handleLookup

ZooKeeper 端口

问题 2:Pulsar 默认使用的 ZooKeeper 配置文件中 metrics 端口设成了 8000,而非 ZooKeeper 默认的 7000。ZooKeeper 和 BooKkeeper metrics 端口冲突。

解答:从 Pulsar 开始暴露 ZooKeeper metric 开始,使用的默认端口就是 8000, 所以当使用最新版本(3.6.3)的 ZooKeeper 时,为了和之前的端口保持一致,就将 ZooKeeper metric 的端口从默认 7000 改为 8000。

这里确实会存在和 BookKeeper metric 端口冲突的问题,如果是在同一台机器上混布 BookKeeper 和 Zookeeper 的话,建议修改其中一个端口。可以通过 export PULSAR_EXTRA_OPTS=-Dstats_server_port=8002 修改 ZooKeeper metrics 端口号。

Topic 相关

topic 级别限速

问题 3:Pulsar 支持 topic 级别的流量限速吗?

解答:支持。可以调用 bin/pulsar-admin topics set-dispatch-rate 和 bin/pulsar-admin topic set-publish-rate 来配置限速规则。

Unload topic

问题 4:Unload topic 时,如何实现 topic owner 转移到新 Broker ,topic 和 bundle 绑定,以及 broker 转移时出现 bundle owner 的转移?

解答:

  • Unload topic 并不会导致 Topic ownership 发生转移,只会关闭当前 topic, 再由客户端触发重新加载。
  • 修改 topic 的 ownership 需要 unload topic 所在的 namespace bundle,如此重新加载 namespace bundle, 会将 namespace bundle 加载到其他的 broker 上,也就相当于 topic 转移到了其他的 broker 上。

topic message

问题 5:Topic 中的 message 如何与 key 对应?该部分元数据存储的位置在哪?

解答:BookKeeper 有两个概念,ledger 和 entry。一个 ledger 由 entry 组成;一个 entry 对应一个 entryId,这个是唯一的。

在 Pulsar 中,每个 message 存成一个 entry,Entry 被存储成功时,bookie 会告知用户一个的唯一 ID 即 entryId, 这个是没有额外元数据存储的。详情可参考 BookKeeper 的 concept

Pulsar 客户端

问题 6:Pulsar 客户端 admin Url 能否支持多个配置多个?

解答:目前暂不支持,可通过反向代理服务,比如 Nginx, 以达到相同的目的。

Pulsar 消息压缩

问题 7:Pulsar 的消息最大限制默认为 5MB,该数值是否为压缩加密之后的值?那么压缩之前是多少?

解答:

  • Topic 的压缩是由客户端发送命令完成的。这里说的 Pulsar 最大消息限制不是指压缩加密后的消息;
  • 消息大小 5MB 指服务接收到的数据包大小,是压缩后的大小,因为压缩是在客户端进行的;
  • maxMessageSize = Commands.DEFAULT_MAX_MESSAGE_SIZE;//默认的消息最大尺寸= 5 1024 1024,这里的设置指的是 Producer 可以发送的最大消息尺寸 (default message size for transfer);
  • byte [] data = new byte[dataLength - 12]; 最大可以发送的数据部分是 Commands.DEFAULT_MAX_MESSAGE_SIZE - 12,12 指的是 entryId 和 length 所占字节数。

Pulsar 强顺序性

问题 8:如何实现 Pulsar 的强顺序性保证?

解答:

  • Pulsar 的消息顺序性基于分区(Partition),每个分区对应一个 managed ledger,它管理一组 BookKeeper ledgers,同时只存在一个活跃的 ledger。而每个 ledger 的写入顺序性是通过 BookKeeper 来保证的;
  • 对于 Pulsar 客户端针对错误场景而进行消息自动重发导致的乱序,默认为无法保证,除非开启消息去重。例如:发送 1 2 3,客户端发现 2 的发送失败,重发 2,此时顺序的定义不再是 1 2 3,而是 1 2 3 2。而去重是基于消息自带的序列号(sequence id)的,即会拒绝第二次 2 的发送。

以上就是第 5 期社区 FAQ 汇总,在此感谢参与社群日常提问与解答的小伙伴们。让我们期待下一期的 FAQ 内容吧!

相关推荐

关注公众号「Apache Pulsar」,获取更多技术干货

加入 Apache Pulsar 中文交流群 👇🏻 

图片


ApachePulsar
192 声望939 粉丝

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