實(shí)戰(zhàn)指南:配置、命令行管理與客戶端使用)
消息隊(duì)列后端流處理【免費(fèi)下載鏈接】pulsarApache Pulsar - distributed pub-sub messaging system項(xiàng)目地址https://gitcode.com/gh_mirrors/pulsar28/pulsar點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本文聚焦 Apache Pulsar 中的非持久化主題Non-persistent topics消息數(shù)據(jù)從不落盤、僅駐留在 broker 內(nèi)存中的主題類型。你將學(xué)會(huì)非持久化主題的命名規(guī)則與適用場(chǎng)景、如何在 broker 配置中開啟enableNonPersistentTopics、如何用pulsar-admin non-persistent命令管理它們以及如何在不改動(dòng)客戶端代碼的前提下直接生產(chǎn)/消費(fèi)消息。全文以當(dāng)前倉庫site2/website-next/versioned_docs/version-2.2.0/cookbooks-non-persistent.md為骨架并結(jié)合 broker 源碼與配置文件給出實(shí)現(xiàn)級(jí)細(xì)節(jié)。Overview什么是非持久化主題默認(rèn)情況下Pulsar 會(huì)把所有未確認(rèn)unacknowledged的消息持久化到多個(gè) BookKeeper bookie存儲(chǔ)節(jié)點(diǎn)上。持久化主題上的消息數(shù)據(jù)因此可以在 broker 重啟、訂閱者故障切換failover后存活。Pulsar 同時(shí)支持非持久化主題這類主題上的消息從不持久化到磁盤僅存在于內(nèi)存中。使用非持久化投遞時(shí)如果殺掉一個(gè) Pulsar broker 或斷開某個(gè)訂閱者連接該非持久化主題上所有傳輸中的in-transit消息都會(huì)丟失客戶端可能觀察到消息丟失。非持久化主題的完整名稱形如注意名稱中的non-persistent域標(biāo)識(shí)non-persistent://tenant/namespace/topic關(guān)于非持久化主題更上層的信息可參考 Concepts and Architecture 文檔 中的非持久化主題章節(jié)。與持久化主題的本質(zhì)差異源碼佐證從 broker 源碼結(jié)構(gòu)看非持久化主題由獨(dú)立類承載pulsar-broker/src/main/java/org/apache/pulsar/broker/service/nonpersistent/NonPersistentTopic.java。該類繼承AbstractTopic并實(shí)現(xiàn)Topic接口與持久化主題的核心差異體現(xiàn)在沒有 ManagedLedger / BookKeeper 寫入鏈路。NonPersistentTopic內(nèi)部不持有ManagedLedger消息發(fā)布路徑publishMessage()直接通過內(nèi)存EntryEntry entry create(0L, 0L, duplicateBuffer)推送給各訂閱者的 dispatcher 與跨集群 replicator而不會(huì)寫 BookKeeper參見 NonPersistentTopic.java。無持久化元數(shù)據(jù)。主題 epoch 等元數(shù)據(jù)只在內(nèi)存中維護(hù)incrementTopicEpoch/setTopicEpoch直接返回內(nèi)存計(jì)算結(jié)果注釋明確寫著 “Non-persistent topic does not have any durable metadata, so were just keeping the epoch in memory”見 NonPersistentTopic.java。消息去重deduplication檢查為空操作checkMessageDeduplicationInfo()為No-op見 NonPersistentTopic.java。訂閱不持久NonPersistentSubscription建立在內(nèi)存中broker 重啟即消失。這些差異決定了非持久化主題犧牲可靠性換取更低發(fā)布延遲省去了寫盤fsync / BookKeeper 復(fù)制開銷。從 admin-api-topics.md 的說明看非持久化主題面向“只消費(fèi)實(shí)時(shí)發(fā)布消息、不需要持久化保證”的應(yīng)用。Using如何生產(chǎn)/消費(fèi)非持久化主題使用非持久化主題前必須先在 broker 配置中開啟enableNonPersistentTopics默認(rèn)即為true。使用非持久化主題時(shí)客戶端唯一要做的區(qū)別就是按名稱區(qū)分主題——在完整主題名中帶上non-persistent域即可。例如下面的pulsar-client produce命令在 standalone 集群上向非持久化主題生產(chǎn)一條消息$ bin/pulsar-client produce non-persistent://public/default/example-np-topic \ --num-produce 1 \ --messages This message will be stored only in memory消費(fèi)側(cè)同理使用pulsar-client consume并指定non-persistent://tenant/namespace/topic形式的主題名$ bin/pulsar-client consume non-persistent://public/default/example-np-topic \ --subscription-name my-subscription \ --num-messages 1從管理視角看更完整的非持久化主題管理指南參見 Managing non-persistent topics管理 API 概覽。服務(wù)端解析路徑從代碼看broker 管理接口通過請(qǐng)求路徑前綴區(qū)分主題域AdminResource.domain()判斷 URI 以persistent/開頭返回persistent以non-persistent/開頭返回non-persistent見 AdminResource.java。因此non-persistent://前綴是服務(wù)端識(shí)別與路由非持久化主題的入口。Enabling在 broker 配置中啟用非持久化主題要在一個(gè) Pulsar broker 上啟用非持久化主題需將enableNonPersistentTopics配置項(xiàng)設(shè)為true。該值默認(rèn)為true所以通常無需任何額外操作即可使用非持久化消息。在conf/broker.conf中對(duì)應(yīng)配置如下見 broker.conf# Enable broker to load persistent topics enablePersistentTopicstrue # Enable broker to load non-persistent topics enableNonPersistentTopicstrue在 broker 源碼中這兩個(gè)開關(guān)定義于pulsar-broker-common/src/main/java/org/apache/pulsar/broker/ServiceConfiguration.javaenablePersistentTopics默認(rèn)true見 ServiceConfiguration.javaenableNonPersistentTopics默認(rèn)true注解說明為 “Enable broker to load non-persistent topics”見 ServiceConfiguration.javastandalone 模式的配置位置如果你以 standalone 模式運(yùn)行 Pulsar同樣的配置參數(shù)位于standalone.conf文件中對(duì)應(yīng)參考配置文檔中的 standalone 配置。如果希望 broker只提供非持久化主題可將enablePersistentTopics設(shè)為false、同時(shí)保持enableNonPersistentTopicstrue# broker.conf僅啟用非持久化主題的極端場(chǎng)景 enablePersistentTopicsfalse enableNonPersistentTopicstrue相關(guān)性能調(diào)優(yōu)參數(shù)擴(kuò)展圍繞非持久化主題conf/broker.conf中還有兩個(gè)值得關(guān)注的內(nèi)存/吞吐參數(shù)定義見 broker.conf默認(rèn)值取自 ServiceConfiguration.java參數(shù)默認(rèn)值說明maxConcurrentNonPersistentMessagePerConnection1000單條連接上可并發(fā)處理的非持久化消息上限numWorkerThreadsForNonPersistentTopicCPU 核數(shù)Runtime.getRuntime().availableProcessors()服務(wù)于非持久化主題的 worker 線程數(shù)可通過配置文件留空讓系統(tǒng)自動(dòng)按核數(shù)確定Managing with CLI用 pulsar-admin 管理非持久化主題非持久化主題可以通過pulsar-admin non-persistent命令行接口管理。該 CLI 在源碼中由pulsar-client-tools/src/main/java/org/apache/pulsar/admin/cli/CmdNonPersistentTopics.java實(shí)現(xiàn)注冊(cè)的子命令包括見 CmdNonPersistentTopics.java子命令說明create-partitioned-topic創(chuàng)建分區(qū)非持久化主題需通過-p/--partitions指定分區(qū)數(shù)lookup從當(dāng)前提供服務(wù)的 broker 上查找lookup主題stats獲取主題及其生產(chǎn)/消費(fèi)者統(tǒng)計(jì)信息stats-internal獲取主題內(nèi)部統(tǒng)計(jì)信息get-partitioned-topic-metadata獲取分區(qū)主題元數(shù)據(jù)list列出某 namespace 下的非持久化主題list-in-bundle列出某 namespace bundle 范圍內(nèi)的非持久化主題常用示例# 創(chuàng)建 4 個(gè)分區(qū)的非持久化分區(qū)主題 $ bin/pulsar-admin non-persistent create-partitioned-topic \ non-persistent://public/default/my-np-topic \ --partitions 4 # 獲取主題統(tǒng)計(jì)速率按最近 1 分鐘窗口計(jì)算 $ bin/pulsar-admin non-persistent stats \ non-persistent://public/default/my-np-topic # 列出 namespace 下全部非持久化主題 $ bin/pulsar-admin non-persistent list public/default # 列出指定 bundle 范圍內(nèi)的非持久化主題 $ bin/pulsar-admin non-persistent list-in-bundle public/default --bundle 0x00000000_0xffffffff注意幾點(diǎn)來自源碼的約束create-partitioned-topic要求--partitions參數(shù)且分區(qū)主題須在創(chuàng)建生產(chǎn)者之前先創(chuàng)建好見 CmdNonPersistentTopics.java 中的 CreatePartitionedCmd 描述。stats的速率統(tǒng)計(jì)按 1 分鐘窗口計(jì)算。REST API 層面非持久化主題管理路徑以non-persistent為 schema 前綴如/admin/v2/non-persistent/:tenant/:namespace與持久化主題共用一套管理接口模型。管理接口與持久化主題的差異雖然 CLI 入口相近但非持久化主題缺少持久化主題的部分能力。從pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java的檢查邏輯可以確認(rèn)按時(shí)間戳獲取消息 IDget-message-by-timestamp、peek 消息、expire 消息等操作對(duì)非持久化主題均不被允許會(huì)返回METHOD_NOT_ALLOWED見 PersistentTopicsBase.java 與 PersistentTopicsBase.java。訂閱時(shí)若開啟readCompacted非持久化主題也會(huì)直接拒絕readCompacted only valid on persistent topics見 NonPersistentTopic.java。Using with Pulsar clients客戶端使用注意事項(xiàng)使用非持久化消息時(shí)Pulsar 客戶端本身不需要任何改動(dòng)——只需確保使用正確的主題名稱即主題類型域?yàn)閚on-persistent的完整主題名。生產(chǎn)者ProducerBuilder中傳入non-persistent://tenant/namespace/topic即可其余 API 用法與持久化主題完全一致。消費(fèi)者同樣僅需在ConsumerBuilder/ReaderBuilder中指定non-persistent://主題名訂閱、ack、消息回調(diào)等 API 均通用。從源碼推斷客戶端無需感知主題類型因?yàn)榉?wù)端AdminResource.domain()已根據(jù)non-persistent前綴完成路由客戶端只在 broker 配置未開啟非持久化主題時(shí)收到創(chuàng)建主題失敗的錯(cuò)誤。總結(jié)與適用場(chǎng)景非持久化主題是 Pulsar 在“持久化可靠性”之外提供的內(nèi)存級(jí)實(shí)時(shí)消息通道核心取舍如下維度非持久化主題持久化主題默認(rèn)消息存儲(chǔ)僅內(nèi)存不寫 BookKeeper多副本寫入 BookKeeper bookie可靠性broker 重啟 / 訂閱者斷連即丟失在途消息可跨 broker 重啟、訂閱者故障切換存活延遲更低省去持久化開銷相對(duì)更高適用場(chǎng)景實(shí)時(shí)流式消費(fèi)、無需回溯、可容忍丟失需要消息不丟失、可重放、可回溯典型適用場(chǎng)景包括實(shí)時(shí)監(jiān)控指標(biāo)、日志流式消費(fèi)、需要極低發(fā)布延遲且允許一定消息丟失的流處理管道。啟用、管理、客戶端接入的完整路徑為broker 配置開啟 →pulsar-admin non-persistent管理 → 客戶端以non-persistent://前綴接入三步即可在集群中跑通內(nèi)存級(jí)消息通道。贊分享消息隊(duì)列后端流處理【免費(fèi)下載鏈接】pulsarApache Pulsar - distributed pub-sub messaging system項(xiàng)目地址https://gitcode.com/gh_mirrors/pulsar28/pulsar點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Apache Pulsar 非持久化主題Non-persistent Topics實(shí)戰(zhàn)指南概念、配置與 CLI 管理Apache Pulsar 非持久化主題Non persistent Topics實(shí)戰(zhàn)指南概念、配置與 CLI 管理 非持久化主題Non persist消息隊(duì)列后端流處理Apache Pulsar 非持久化主題Non-persistent Topics實(shí)戰(zhàn)指南從內(nèi)存分發(fā)原理到 CLI 管理Apache Pulsar 非持久化主題Non persistent Topics實(shí)戰(zhàn)指南從內(nèi)存分發(fā)原理到 CLI 管理 本文聚焦 Apache Puls消息隊(duì)列后端流處理Apache Pulsar 非持久化主題Non-persistent Topics完整指南概念、配置、CLI 與源碼原理Apache Pulsar 非持久化主題Non persistent Topics完整指南概念、配置、CLI 與源碼原理 非持久化主題non persi消息隊(duì)列后端流處理創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考