溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Storm的ack機(jī)制是什么

發(fā)布時(shí)間:2021-12-23 11:51:08 來(lái)源:億速云 閱讀:172 作者:iii 欄目:云計(jì)算

這篇文章主要介紹“Storm的ack機(jī)制是什么”,在日常操作中,相信很多人在Storm的ack機(jī)制是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Storm的ack機(jī)制是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

Ack機(jī)制

Storm可以保證從Spout發(fā)出的每個(gè)數(shù)據(jù)都被完全處理,從Spout發(fā)出的數(shù)據(jù)可能會(huì)產(chǎn)生成千上萬(wàn)的數(shù)據(jù)。 一個(gè)Tuple被完全處理指:這個(gè)Tuple以及這個(gè)Tuple產(chǎn)生的所有Tuple都被成功處理。而一個(gè)Tuple被認(rèn)為處理失敗是被是指在timeout時(shí)間內(nèi)沒(méi)有被成功處理(包括顯示的fail和超時(shí)導(dǎo)致的失?。?這個(gè)timeout時(shí)間可以通過(guò) Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS來(lái)設(shè)定。Timeout的默認(rèn)時(shí)長(zhǎng)為30秒。

Storm的Bolt有BsicBolt和RichBolt,在BasicBolt中,BasicOutputCollector在emit數(shù)據(jù)的時(shí)候,會(huì)自動(dòng)和輸入的tuple相關(guān)聯(lián),而在execute方法結(jié)束的時(shí)候那個(gè)輸入tuple會(huì)被自動(dòng)ack。

在使用RichBolt時(shí)要實(shí)現(xiàn)ack,則需要在emit數(shù)據(jù)的時(shí)候,顯示指定該數(shù)據(jù)的源tuple,即collector.emit(oldTuple, newTuple);并且需要在execute執(zhí)行成功后調(diào)用源tuple的ack進(jìn)行ack。

需要說(shuō)明的是,要實(shí)現(xiàn)ack機(jī)制,必須在spout發(fā)射tuple的時(shí)候指定messageId。并且需要在spout中對(duì)tuple進(jìn)行緩存,對(duì)于ack的tuple則從緩存隊(duì)列中刪除,對(duì)于fail的tuple可以選擇重發(fā)。不同的Tuple可以綁定同一個(gè)messageId,表明這多個(gè)Tuple對(duì)用戶(hù)來(lái)說(shuō)是同一個(gè)消息單元。

這個(gè)messageId只是業(yè)務(wù)上為了我們方便區(qū)分是哪個(gè)Tuple返回來(lái)的,Storm內(nèi)部并不對(duì)其進(jìn)行處理。因此,不同的Tuple綁定同一個(gè)messageId時(shí),在ack和fail中不能區(qū)分是哪個(gè)Tuple成功或失敗,只知道其綁定的messageId。

調(diào)整可靠性 (Tuning Reliability)

Acker task是非常輕量級(jí)的, 所以一個(gè)topology里面不需要很多acker。你可以通過(guò)Strom UI(id: -1)來(lái)跟蹤它的性能。 如果它的吞吐量看起來(lái)不正常,那么你就需要多加點(diǎn)acker了。

如果可靠性對(duì)你來(lái)說(shuō)不是那么重要 — 你不太在意在一些失敗的情況下?lián)p失一些數(shù)據(jù), 那么你可以通過(guò)不跟蹤這些tuple樹(shù)來(lái)獲取更好的性能。不去跟蹤消息的話(huà)會(huì)使得系統(tǒng)里面的消息數(shù)量減少一半, 因?yàn)閷?duì)于每一個(gè)tuple都要發(fā)送一個(gè)ack消息。并且它需要更少的id來(lái)保存下游的tuple, 減少帶寬占用。

有三種方法可以去掉可靠性。第一是把Config.TOPOLOGY_ACKERS 設(shè)置成 0. 在這種情況下, storm會(huì)在spout發(fā)射一個(gè)tuple之后馬上調(diào)用spout的ack方法。也就是說(shuō)這個(gè)tuple樹(shù)不會(huì)被跟蹤。

第二個(gè)方法是在tuple層面去掉可靠性。 你可以在發(fā)射tuple的時(shí)候不指定messageid來(lái)達(dá)到不跟粽某個(gè)特定的spout tuple的目的。

最后一個(gè)方法是如果你對(duì)于一個(gè)tuple樹(shù)里面的某一部分到底成不成功不是很關(guān)心,那么可以在發(fā)射這些tuple的時(shí)候unanchor它們。 這樣這些tuple就不在tuple樹(shù)里面, 也就不會(huì)被跟蹤了。

Ack原理

Storm中有個(gè)特殊的task,他們負(fù)責(zé)跟蹤spout發(fā)出的每一個(gè)Tuple的Tuple樹(shù)。當(dāng)acker發(fā)現(xiàn)一個(gè)Tuple樹(shù)已經(jīng)處理完成了,它會(huì)發(fā)送一個(gè)消息給產(chǎn)生這個(gè)Tuple的那個(gè)task。Acker的跟蹤算法是Storm的主要突破之一,對(duì)任意大的一個(gè)Tuple樹(shù),它只需要恒定的20字節(jié)就可以進(jìn)行跟蹤。

Acker跟蹤算法的原理:acker對(duì)于每個(gè)spout-tuple保存一個(gè)ack-val的校驗(yàn)值,它的初始值是0,然后每發(fā)射一個(gè)Tuple或Ack一個(gè)Tuple時(shí),這個(gè)Tuple的id就要跟這個(gè)校驗(yàn)值異或一下,并且把得到的值更新為ack-val的新值。那么假設(shè)每個(gè)發(fā)射出去的Tuple都被ack了,那么最后ack-val的值就一定是0。Acker就根據(jù)ack-val是否為0來(lái)判斷是否完全處理,如果為0則認(rèn)為已完全處理。

到此,關(guān)于“Storm的ack機(jī)制是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI