您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何分析Pulsar 的消息保留和過(guò)期策略,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
默認(rèn)情況下,Pulsar Broker 會(huì)對(duì)消息做如下處理:
對(duì)于未被確認(rèn)的消息會(huì)存儲(chǔ)到 backlog 中。
但是,很多線上的生產(chǎn)環(huán)境下,這種默認(rèn)行為并不能滿足我們的生產(chǎn)需求,所以,Pulsar 提供了如下配置策略來(lái)覆蓋這些行為:
TTL 策略:對(duì)于未確認(rèn)的消息,用戶可以通過(guò)設(shè)置 TTL 來(lái)使未確認(rèn)的消息到達(dá)已經(jīng)確認(rèn)的狀態(tài)。
上述兩種策略的設(shè)置都是在 NameSpace 的級(jí)別進(jìn)行設(shè)置
Retention 策略
Retention 策略的設(shè)置提供了兩種方式:
消息被保存的時(shí)間,默認(rèn)值:defaultRetentionTimeInMinutes=0
我們可以在 broker.conf 中對(duì)這兩項(xiàng)內(nèi)容進(jìn)行配置也可以通過(guò)命令行的形式。上文提到過(guò),這兩種策略的設(shè)置,都是在 NameSpace 的級(jí)別進(jìn)行設(shè)置,所以當(dāng)我們使用命令行配置時(shí),使用 NameSpaces 來(lái)進(jìn)行配置,具體如下:
root@e6df71e544ea:/pulsar# ./bin/pulsar-admin namespaces set-retention
The following options are required: --size, -s --time, -t
Set the retention policy for a namespace
Usage: set-retention [options] tenant/namespace
Options:
* --size, -s
Retention size limit (eg: 10M, 16G, 3T). 0 or less than 1MB means no
retention and -1 means infinite size retention
* --time, -t
Retention time in minutes (or minutes, hours, days, weeks eg: 100m, 3h, 2d,
5w). 0 means no retention and -1 means infinite time retention
如上所示:我們可以通過(guò) -s 或者 -t 來(lái)指定我們需要配置的大小或者時(shí)間。
當(dāng)你設(shè)置 Retention 策略之后,可以通過(guò)如下命令來(lái)查看具體的信息:
$ pulsar-admin namespaces get-retention [your tenant]/[your-namespace]{ "retentionTimeInMinutes": 10, "retentionSizeInMB": 0}
Backlog
backlog 是未被確認(rèn)消息的集合,它有一個(gè)大前提是,這些消息所在的 Topic 是被 Broker 所持久化的,在默認(rèn)情況下,用戶創(chuàng)建的 Topic 都會(huì)被持久化。換句話說(shuō),Pulsar Broker 會(huì)將所有未確認(rèn)或者未處理的消息都存放到 backlog 中。
同樣的,我們可以在 NameSpace 級(jí)別對(duì) backlog 的大小進(jìn)行配置。需要注意的是,對(duì) backlog 進(jìn)行配置時(shí),我們需要明確以下兩點(diǎn):
如果超過(guò)設(shè)定的 backlog 的閾值,將會(huì)執(zhí)行哪些操作
當(dāng)超過(guò)設(shè)定的 backlog 的閾值,Pulsar 提供了以下三種策略供用戶選擇:
你可以通過(guò) set-backlog-quota 在 NameSpace 級(jí)別對(duì) backlog 進(jìn)行配置,具體如下:
root@e6df71e544ea:/pulsar# ./bin/pulsar-admin namespaces set-backlog-quota
The following options are required: -l, --limit -p, --policy
Set a backlog quota policy for a namespace
Usage: set-backlog-quota [options] tenant/namespace
Options:
* -l, --limit
Size limit (eg: 10M, 16G)
* -p, --policy
Retention policy to enforce when the limit is reached. Valid options are:
[producer_request_hold, producer_exception, consumer_backlog_eviction]
如上所示,set-backlog-quota 提供了兩個(gè)參數(shù),-l 用來(lái)指定你設(shè)置 backlog 的大小,-p 用來(lái)指定,當(dāng)超過(guò)你設(shè)置的 backlog 的閾值之后,Broker 將會(huì)執(zhí)行的策略。
當(dāng)你設(shè)置 backlog 之后,可以通過(guò)如下命令,查看相應(yīng)的信息:
$ pulsar-admin namespaces get-backlog-quotas [your tenant]/[your namespace]{ "destination_storage": { "limit" : 2147483648, "policy" : "producer_request_hold" }}
如果你期望取消 backlog 的配置,可以使用如下命令:
$ pulsar-admin namespaces remove-backlog-quota [your tenant]/[your namespace]
當(dāng)有消息積壓時(shí),你可以通過(guò) clear-backlog 來(lái)清除積壓的消息。清除 backlog 中積壓的消息是相對(duì)危險(xiǎn)的操作,所以系統(tǒng)會(huì)提示你,是否確認(rèn)要?jiǎng)h除 backlog 中的消息, clear-backlog 提供了 -f(--force) 的參數(shù)來(lái)屏蔽該提示。
$ pulsar-admin namespaces clear-backlog [your tenant]/[your namespace]
Time To Live (TTL)
默認(rèn)情況下,Pulsar 會(huì)持久化所有未被確認(rèn)的消息。如果未被確認(rèn)的消息有很多,這種策略會(huì)造成大量的消息被積壓,導(dǎo)致磁盤空間增大。有些場(chǎng)景下,消息并不需要被持久化,用戶更期望的行為是,將這些未被確認(rèn)的消息直接丟棄。這種情況下,你可以通過(guò)設(shè)置 TTL 使得未被確認(rèn)的消息進(jìn)入到被確認(rèn)的狀態(tài),當(dāng)超過(guò)設(shè)定的 TTL 時(shí)間之后,配合相應(yīng)的 Retention 策略將消息丟棄。
TTL 的一個(gè)典型使用場(chǎng)景是,當(dāng) Consumer 由于某些原因出現(xiàn)故障,不能正常消費(fèi)消息,這時(shí) Producer 還在不斷的往 Topic 中生產(chǎn)消息,會(huì)造成 Topic 中有大量的未確認(rèn)的消息出現(xiàn),這時(shí)你可以通過(guò)設(shè)置 TTL 將這些未確認(rèn)的消息變?yōu)橐汛_認(rèn)的狀態(tài)。
同樣的,你可以在 Namesapce 級(jí)別下,通過(guò)指定 set-message-ttl 對(duì) TTL 進(jìn)行設(shè)置,具體命令如下:
root@e6df71e544ea:/pulsar# ./bin/pulsar-admin namespaces set-message-ttl
The following option is required: --messageTTL, -ttl
Set Message TTL for a namespace
Usage: set-message-ttl [options] tenant/namespace
Options:
* --messageTTL, -ttl
Message TTL in seconds
Default: 0
如上所示,set-message-ttl 只有一個(gè)參數(shù) -ttl,單位為秒,默認(rèn)值為 0。
當(dāng)你設(shè)置 TTL 策略之后,可以通過(guò) get-message-ttl 查看相應(yīng)的配置信息,具體如下:
$ pulsar-admin namespaces get-message-ttl [your tenant]/[your namespace]60
TTL、Backlog 與 Retention 的區(qū)別和聯(lián)系
在上述的描述過(guò)程中,可以發(fā)現(xiàn),TTL 只去處理一件事情,將未被確認(rèn)的消息變?yōu)楸淮_認(rèn)的狀態(tài),TTL 本身不會(huì)去涉及相應(yīng)的刪除操作,具體如下圖所示:
在 T3 階段,到達(dá) TTL 設(shè)定的閾值,m6、m7、m8 這三條消息被確認(rèn)
通過(guò)上圖可以看到,對(duì)于 backlog 中未被確認(rèn)的消息,當(dāng)你設(shè)置 TTL 之后,會(huì)將未確認(rèn)消息的狀態(tài)變?yōu)榇_認(rèn)的狀態(tài)。TTL 在這里所起到的作用就是將消息的 Cursor 從 m5 移動(dòng)到 m8,m6、m7、m8 這三條消息變?yōu)橐汛_認(rèn)狀態(tài)。
Pulsar 是一個(gè) multiple-subscription 的消息系統(tǒng),對(duì)于 Topic 中的一條消息,只有當(dāng)所有訂閱者都對(duì)這條消息 ack 或者消費(fèi)了,它才能被刪除。
默認(rèn)情況下,Pulsar Broker 會(huì)將所有未確認(rèn)的消息持久化到 backlog 中。TTL 的功能是,你可以將這些未被確認(rèn)的消息變?yōu)楸淮_認(rèn)的狀態(tài),而 Retention 所關(guān)注的點(diǎn)是,當(dāng)消息處于被確認(rèn)的狀態(tài)時(shí),你可以對(duì)已確認(rèn)的消息進(jìn)行的保留策略是什么。換句話說(shuō),backlog 是針對(duì)未確認(rèn)的消息,Broker 所做的處理是什么。Retention 是針對(duì)已確認(rèn)的消息,Broker 所做的保留策略是什么。
TTL 與死信隊(duì)列
死信隊(duì)列的相關(guān)介紹在此不做贅述。
在生產(chǎn)環(huán)境中,有時(shí)可能遇到質(zhì)量差的數(shù)據(jù)是由于上游的原因?qū)е碌模仨氂缮嫌蝸?lái)解決,繼續(xù)嘗試處理其它的消息已經(jīng)沒有意義,這時(shí)候用戶希望在發(fā)生錯(cuò)誤時(shí)立即停止處理。Pulsar 中提供了一種特殊的 Topic——死信隊(duì)列。
死信隊(duì)列與 TTL 都可以將未確認(rèn)的消息變?yōu)橐汛_認(rèn)的狀態(tài)。他們之間主要的不同在于,在上圖中的 T2 階段,TTL 只是將未確認(rèn)的消息變?yōu)橐汛_認(rèn)的狀態(tài),死信隊(duì)列的做法是將消息丟棄到死信隊(duì)列中,m6、m7、m8 這三條消息變?yōu)楸淮_認(rèn)的狀態(tài)。m9、m10 這兩條有效消息會(huì)正常處理,Broker 也會(huì)繼續(xù)運(yùn)行。之后,你可以從死信隊(duì)列中檢查無(wú)效消息,并根據(jù)需要忽略或修復(fù)并重新處理。用戶可以根據(jù)自己的需求來(lái)確定未確認(rèn)的消息是通過(guò) TTL 的形式將其變?yōu)榇_認(rèn)狀態(tài)還是通過(guò)死信隊(duì)列的方式來(lái)實(shí)現(xiàn),依據(jù)的主要標(biāo)準(zhǔn)就是看你需不要處理消費(fèi)不了的消息。
使用問題
場(chǎng)景一:
啟動(dòng) Producer 往 Broker 發(fā)送消息,設(shè)置了 TTL ,沒有啟動(dòng) Consumer,同時(shí)設(shè)置了 Retention 策略為半小時(shí),到達(dá) Retention 的閾值之后,發(fā)現(xiàn)設(shè)置 TTL 的消息并沒有被移除,這是為什么呢?
在上述場(chǎng)景中,有一個(gè)問題需要注意,沒有啟動(dòng) Consumer,在上面我們說(shuō)到,TTL 是將消息設(shè)置的 Cousor 向前移動(dòng),如果沒有啟動(dòng) Consumer,相當(dāng)于 Cousor 沒有被初始化,也就是如果沒有 Consumer,你就沒有必要去設(shè)置 TTL。
場(chǎng)景二:
我設(shè)置了Retention 策略,但是到達(dá)了 Retention 的閾值,Topic 中的數(shù)據(jù)并沒有被刪除掉,這是為什么呢?
這個(gè)是 Pulsar 內(nèi)部的一個(gè)實(shí)現(xiàn)機(jī)制,在 Pulsar 中 Topic 是一個(gè)邏輯的概念,一個(gè) Topic 對(duì)應(yīng)一個(gè) manage ledger,當(dāng)你寫數(shù)據(jù)的時(shí)候,實(shí)際上是將數(shù)據(jù)寫到了 ledger 中,還記得在之前很多文章中提到的有關(guān) Pulsar 設(shè)計(jì)的一個(gè)核心所在:在 Pulsar 中,所有的操作都是異步的,所以當(dāng) Retention 到達(dá)指定閾值之后,是否刪除對(duì)應(yīng) ledger 中的數(shù)據(jù),這個(gè)操作也是異步的。delete 的操作是不會(huì)對(duì)當(dāng)前 active 的 ledger 執(zhí)行的。只有當(dāng)數(shù)據(jù)寫滿了當(dāng)前的 ledger ,ledger 發(fā)生切換時(shí),才會(huì)去真正的執(zhí)行 retention 策略。
如果想要強(qiáng)制執(zhí)行,可以使用 pulsar-admin 將當(dāng)前的 ledger 強(qiáng)制卸載,迫使其發(fā)生 ledger 的切換。
關(guān)于如何分析Pulsar 的消息保留和過(guò)期策略就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。