Apache Pulsar 非持久化消息Non-persistent Topics完全指南内存级 Topic 的配置、管理与源码解析【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar本篇技术指南围绕 Apache Pulsar 的非持久化主题Non-persistent Topics展开系统讲解其核心概念、启用与配置方式、命令行管理与客户端使用实战并结合当前仓库源码Broker 服务实现、Admin REST 接口与 CLI 工具深入剖析其底层行为。读完本文你将掌握如何通过non-persistent://主题名使用纯内存消息投递、如何通过enableNonPersistentTopics等参数调优 Broker以及非持久化主题在消息丢失、性能与适用场景上的取舍。非持久化主题是什么默认情况下Pulsar 会将所有未确认的消息持久化存储到多个 BookKeeper Bookie 节点上。持久化主题persistent topics上的消息数据因此可以在 Broker 重启、订阅者故障切换等场景下存活。与之相对Pulsar 也支持非持久化主题non-persistent topics这类主题上的消息从不落盘只存在于内存中。一旦 Broker 宕机或订阅者断开连接该非持久化主题上所有在途消息都会随之丢失客户端可能因此观察到消息丢失。非持久化主题的完整名称形如注意名称中的non-persistent类型标识non-persistent://tenant/namespace/topic在 Pulsar 的 Topic 命名体系中persistent/non-persistent是标识主题类型的两个前缀默认类型为持久化——如果你不指定类型前缀主题即视为持久化主题。关于两种主题类型的更高层概念介绍可参阅 Concepts and Architecture 文档中的 Non-persistent topics 章节。非持久化主题的适用场景与代价非持久化主题的价值在于降低消息投递路径上的持久化开销。由于无需写入 BookKeeper、无需等待落盘确认它更适合对延迟敏感、可以容忍消息丢失的场景例如实时监控与指标流丢失少量采样点可接受日志流汇聚与过滤管道高速遥测数据、传感器数据的中转。需要清醒认识的是其代价可靠性让位于性能。Broker 重启、订阅者断连都会导致在途消息丢失同时消息仅存在于内存Broker 内存压力也会随之上升。因此在选择主题类型时应结合业务对数据完整性的要求做出取舍而不是盲目追求低延迟。启用非持久化主题要在 Broker 上启用非持久化主题需要将enableNonPersistentTopics参数设置为true。该参数默认即为true因此通常情况下无需任何额外操作即可使用非持久化消息。在集群部署中该参数位于 conf/broker.conf# Enable broker to load non-persistent topics enableNonPersistentTopicstrue在 standalone 单机模式下同样的配置参数位于 conf/standalone.conf# Enable broker to load non-persistent topics enableNonPersistentTopicstrue如果你希望某个 Broker只提供非持久化主题服务可以将enablePersistentTopics设为false、同时保持enableNonPersistentTopicstrue见 conf/broker.conf 中的注释# Enable broker to load persistent topicsenablePersistentTopicsfalse enableNonPersistentTopicstrue从源码看开关如何生效enableNonPersistentTopics不仅仅是一个开关语义的配置项它还参与了 Broker 的负载均衡决策与主题创建拦截在负载均衡层面SimpleLoadManagerImpl与ModularLoadManagerImpl都会在负载报告中上报nonPersistentTopicsEnabled字段见 pulsar-broker/src/main/java/org/apache/pulsar/broker/loadbalance/impl/SimpleLoadManagerImpl.java负载均衡器据此判断某个 Broker 是否有能力承载非持久化主题避免把非持久化主题分配到未启用该能力的节点上在主题创建层面BrokerService.createNonPersistentTopic() 会先检查isEnableNonPersistentTopics()若为false直接返回NotAllowedException(Broker is not unable to load non-persistent topic)拒绝加载非持久化主题随后通过NonPersistentTopic实例完成主题初始化、命名空间归属检查checkTopicNsOwnership与复制检查checkReplication。其他相关 Broker 配置项除总开关外Broker 还提供若干与非持久化主题运行时行为相关的参数这些参数同样同时存在于 conf/broker.conf 与 conf/standalone.conf 中配置项默认值说明enablePersistentTopicstrue是否允许 Broker 加载持久化主题可与enableNonPersistentTopics组合实现仅非持久化或仅持久化部署enableNonPersistentTopicstrue是否允许 Broker 加载非持久化主题maxConcurrentNonPersistentMessagePerConnection1000每条连接上可同时处理的非持久化消息数上限用于限制单连接的并发消息处理压力见 conf/broker.confnumWorkerThreadsForNonPersistentTopic8standalone/ 空broker表示由系统决定服务非持久化主题的工作线程数直接影响并发吞吐见 conf/standalone.conf 与 conf/broker.conf其中maxConcurrentNonPersistentMessagePerConnection与numWorkerThreadsForNonPersistentTopic是调优高吞吐非持久化场景的关键旋钮前者防止单连接消息处理过载后者决定处理线程池规模两者共同约束了内存中消息流转的并发度。使用非持久化主题使用非持久化主题非常简单无需修改任何 Broker 配置以外的设置只需在交互时通过主题名加以区分即可。例如下面的pulsar-client produce命令会在 standalone 集群中向一个非持久化主题生产一条消息$ bin/pulsar-client produce non-persistent://public/default/example-np-topic \ --num-produce 1 \ --messages This message will be stored only in memory该命令与普通持久化主题的唯一区别就是主题名中的non-persistent://前缀。生产端无需感知底层存储差异Pulsar 客户端协议层会依据主题名路由到对应的 Topic 实现。从管理视角出发的非持久化主题更完整指南可参阅 admin-api-topics 文档中的 Non-persistent topics 部分。通过 CLI 管理非持久化主题非持久化主题可以通过pulsar-admin non-persistent命令族进行管理。在仓库中该命令族由 pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNonPersistentTopics.java 实现对应 REST 服务端为 pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v2/NonPersistentTopics.java。常用操作包括创建分区的非持久化主题对应create-partitioned-topic子命令服务端实现为PUT /non-persistent/{tenant}/{namespace}/{topic}/partitions见 NonPersistentTopics.java查看主题统计信息stats子命令对应GET /non-persistent/{tenant}/{namespace}/{topic}/stats返回NonPersistentTopicStats类型的统计结果见 NonPersistentTopics.java列出命名空间下的非持久化主题list子命令对应GET /non-persistent/{tenant}/{namespace}见 NonPersistentTopics.java。示例命令形式# 列出 public/default 命名空间下的非持久化主题 $ bin/pulsar-admin non-persistent list public/default # 查看某个非持久化主题的统计信息 $ bin/pulsar-admin non-persistent stats non-persistent://public/default/example-np-topic # 创建分区的非持久化主题例如 4 个分区 $ bin/pulsar-admin non-persistent create-partitioned-topic non-persistent://public/default/example-np-topic -p 4需要注意CmdNonPersistentTopics在仓库中被标记为hidden true属于管理后台的隐藏命令族其核心职责是把non-persistent://tenant/namespace/topic形式的主题名参数做合法性校验见 CliCommand.validateNonPersistentTopic再转发给 Admin API 客户端。与 Pulsar 客户端配合使用使用非持久化消息时你的 Pulsar 客户端代码几乎不需要做任何改动——唯一需要保证的是使用正确的主题名即以non-persistent作为主题类型前缀例如non-persistent://my-tenant/my-namespace/my-topic无论是 Java、C、Python 还是 Go 客户端生产者与消费者的创建方式与持久化主题完全一致主题类型由名称自动推导客户端 API 无需感知底层是否落盘。这意味着你可以把现有应用中的某个主题从persistent切换为non-persistent或反之仅通过修改主题名即可完成业务代码零改动。源码视角非持久化主题的内部实现为了更深入理解非持久化主题的行为可以阅读其核心实现类 NonPersistentTopic.java位于pulsar-broker/src/main/java/org/apache/pulsar/broker/service/nonpersistent/目录。从源码结构可以推断出以下关键设计内存驻留与持久化主题依赖 ManagedLedger BookKeeper 不同NonPersistentTopic将消息存放在内存数据结构中不经过磁盘写入路径因此吞吐与延迟表现更优无持久化订阅游标非持久化主题不支持基于磁盘的游标恢复订阅者需要重新连接并接受消息回退窗口之外的丢失Broker 生命周期绑定消息生命周期与 Broker 进程强绑定进程退出即数据消失这也解释了为何官方文档明确提示killing a broker 或 disconnecting a subscriber 会导致在途消息全部丢失。此外非持久化主题同样支持分区partitioned形态——Admin 层通过/non-persistent/{tenant}/{namespace}/{topic}/partitions创建分区分区后的统计信息可通过partitioned-stats接口聚合获取见 NonPersistentTopics.java。小结与最佳实践维度非持久化主题持久化主题消息存储仅内存不落盘BookKeeper 多副本持久化消息可靠性Broker 重启 / 订阅者断连即丢失可跨 Broker 重启与订阅者故障切换存活延迟与吞吐省去落盘开销通常更优受持久化路径影响主题名前缀non-persistent://persistent://默认适用场景实时指标、日志管道等可容忍丢失的场景消息关键、需要严格保证投递的业务实践建议确认开关生产环境部署前确认 conf/broker.conf 中enableNonPersistentTopicstruestandalone 环境检查 conf/standalone.conf明确命名所有客户端与 CLI 操作都通过non-persistent://tenant/namespace/topic名称区分主题类型切勿混用前缀评估丢失容忍度在引入非持久化主题前明确业务对Broker 故障丢消息的容忍边界必要时用maxConcurrentNonPersistentMessagePerConnection与numWorkerThreadsForNonPersistentTopic控制内存中的并发消息量结合监控使用pulsar-admin non-persistent stats观察非持久化主题的实时统计及时掌握消息流量与连接状态。【免费下载链接】pulsarApache Pulsar - distributed pub-sub messaging system项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
