Storm的通信机制
- 目錄
- 前言:
- 1、Worker進(jìn)程間通信原理
- 2、Worker進(jìn)程間技術(shù)(Netty、ZeroMQ)
- 3、Worker 內(nèi)部通信技術(shù)(Disruptor)
- 總結(jié):
目錄
前言:
這篇文章,博客主要介紹下Storm中Worker進(jìn)程間和進(jìn)程內(nèi)部通信的原理和技術(shù)。整篇內(nèi)容僅供了解,如有不足或錯(cuò)誤請(qǐng)指出。
Worker間的通信經(jīng)常需要通過網(wǎng)絡(luò)跨節(jié)點(diǎn)進(jìn)行,Storm使用ZeroMQ或Netty(0.9以后默認(rèn)使用)作為進(jìn)程間通信的消息框架。
Worker進(jìn)程內(nèi)部通信:不同worker的thread通信使用LMAX Disruptor來完成。
不同topologey之間的通信,Storm不負(fù)責(zé),需要自己想辦法實(shí)現(xiàn),例如使用kafka等。
1、Worker進(jìn)程間通信原理
worker進(jìn)程間消息傳遞機(jī)制,消息的接收和處理的大概流程見下圖
1、對(duì)于worker進(jìn)程來說,為了管理流入和傳出的消息,每個(gè)worker進(jìn)程有一個(gè)獨(dú)立的接收線程<一個(gè)worker進(jìn)程運(yùn)行一個(gè)專用的接收線程來負(fù)責(zé)將外部發(fā)送過來的消息移動(dòng)到對(duì)應(yīng)的executor線程的incoming-queue中>(對(duì)配置的TCP端口supervisor.slots.ports進(jìn)行監(jiān)聽)對(duì)應(yīng)Worker接收線程,每個(gè)worker存在一個(gè)獨(dú)立的發(fā)送線程(transfer-queue的每個(gè)元素實(shí)際上代表一個(gè)tuple的集合) ,它負(fù)責(zé)從worker的transfer-queue中讀取消息,并通過網(wǎng)絡(luò)發(fā)送給其他worker。
2、每個(gè)executor有自己的incoming-queue 和outgoing-queue 。
Worker接收線程將收到的消息通過task編號(hào)傳遞給對(duì)應(yīng)的executor(一個(gè)或多個(gè))的incoming-queues;
每個(gè)executor有單獨(dú)的線程分別來處理spout/bolt的業(yè)務(wù)邏輯,業(yè)務(wù)邏輯輸出的中間數(shù)據(jù)會(huì)存放在outgoing-queue中,當(dāng)executor的outgoing-queue中的tuple達(dá)到一定的閥值,executor的發(fā)送線程將批量獲取outgoing-queue中的tuple,并發(fā)送到transfer-queue中。
3、每個(gè)worker進(jìn)程控制一個(gè)或多個(gè)executor線程,用戶可在代碼中進(jìn)行配置。其實(shí)就是我們?cè)诖a中設(shè)置的并發(fā)度個(gè)數(shù)。
總結(jié):每個(gè)work都有對(duì)應(yīng)的接受線程用來通過網(wǎng)絡(luò)接收外部發(fā)送過來的消息,并根據(jù)tuple中包含的taskId匹配到對(duì)應(yīng)的excutor,將該消息移動(dòng)到對(duì)應(yīng)的excutor線程的incoming-queue里面,excutor從incoming-queue里面拿數(shù)據(jù)進(jìn)行處理后(通過bolt的excute方法來消費(fèi)incoming-queue中的tuple數(shù)據(jù)),將中間結(jié)果輸出到outgoing-queue中,當(dāng)outgoing-queue中的數(shù)據(jù)達(dá)到一定的閾值之后,excutor的發(fā)送線程會(huì)將outgoing-queue中的數(shù)據(jù)發(fā)送到worker的transfer-queue中,而worker的發(fā)送線程再將transfer-queue中讀到的消息通過網(wǎng)絡(luò)發(fā)送給其他的worker.
2、Worker進(jìn)程間技術(shù)(Netty、ZeroMQ)
2.1、Netty
Netty是一個(gè)NIO client-server(客戶端服務(wù)器)框架,使用Netty可以快速開發(fā)網(wǎng)絡(luò)應(yīng)用,例如服務(wù)器和客戶端協(xié)議。Netty提供了一種新的方式來使開發(fā)網(wǎng)絡(luò)應(yīng)用程序,這種新的方式使得它很容易使用和有很強(qiáng)的擴(kuò)展性。Netty的內(nèi)部實(shí)現(xiàn)時(shí)很復(fù)雜的,但是Netty提供了簡單易用的api從網(wǎng)絡(luò)處理代碼中解耦業(yè)務(wù)邏輯。Netty是完全基于NIO實(shí)現(xiàn)的,所以整個(gè)Netty都是異步的。
書籍:Netty權(quán)威指南
2.2、ZeroMQ
ZeroMQ是一種基于消息隊(duì)列的多線程網(wǎng)絡(luò)庫,其對(duì)套接字類型、連接處理、幀、甚至路由的底層細(xì)節(jié)進(jìn)行抽象,提供跨越多種傳輸協(xié)議的套接字。ZeroMQ是網(wǎng)絡(luò)通信中新的一層,介于應(yīng)用層和傳輸層之間(按照TCP/IP劃分),其是一個(gè)可伸縮層,可并行運(yùn)行,分散在分布式系統(tǒng)間。
ZeroMQ定位為:一個(gè)簡單好用的傳輸層,像框架一樣的一個(gè)socket library,他使得Socket編程更加簡單、簡潔和性能更高。是一個(gè)消息處理隊(duì)列庫,可在多個(gè)線程、內(nèi)核和主機(jī)盒之間彈性伸縮。ZMQ的明確目標(biāo)是“成為標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議棧的一部分,之后進(jìn)入Linux內(nèi)核”。
3、Worker 內(nèi)部通信技術(shù)(Disruptor)
3.1、Disruptor的來歷
- 一個(gè)公司的業(yè)務(wù)與技術(shù)的關(guān)系,一般可以分為三個(gè)階段。第一個(gè)階段就是跟著業(yè)務(wù)跑。第二個(gè)階段是經(jīng)歷了幾年的時(shí)間,才達(dá)到的驅(qū)動(dòng)業(yè)務(wù)階段。第三個(gè)階段,技術(shù)引領(lǐng)業(yè)務(wù)的發(fā)展乃至企業(yè)的發(fā)展。所以我們?cè)趯W(xué)習(xí)Disruptor這個(gè)技術(shù)時(shí),不得不提LMAX這個(gè)機(jī)構(gòu),因?yàn)镈isruptor這門技術(shù)就是由LMAX公司開發(fā)并開源的。
- LMAX是在英國注冊(cè)并受到FSA監(jiān)管(監(jiān)管號(hào)碼為509778)的外匯黃金交易所。LMAX也是歐洲第一家也是唯一一家采用多邊交易設(shè)施Multilateral
Trading Facility(MTF)擁有交易所牌照和經(jīng)紀(jì)商牌照的歐洲頂級(jí)金融公司 - LAMX擁有最迅捷的交易平臺(tái),頂級(jí)技術(shù)支持。LMAX交易所使用“(MTF)分裂器Disruptor”技術(shù),可以在極短時(shí)間內(nèi)(一般在3百萬秒之一內(nèi))處理訂單,在一個(gè)線程里每秒處理6百萬訂單。所有訂單均為撮合成交形式,無一例外。多邊交易設(shè)施(MTF)曾經(jīng)用來設(shè)計(jì)倫敦證券交易所(london Stock Exchange)、德國證券及衍生工具交易所(Deutsche Borse)和歐洲證券交易所(Euronext)。
- 2011年LMAX憑借該技術(shù)獲得了金融行業(yè)技術(shù)評(píng)選大賽的最佳交易系統(tǒng)獎(jiǎng)和甲骨文“公爵杯”創(chuàng)新編程框架獎(jiǎng)。
3.2、Disruptor是什么
1、 簡單理解:Disruptor是一個(gè)Queue。Disruptor是實(shí)現(xiàn)了“隊(duì)列”的功能,而且是一個(gè)有界隊(duì)列(長度有限)。而隊(duì)列的應(yīng)用場景自然就是“生產(chǎn)者-消費(fèi)者”模型。
2、 在JDK中Queue有很多實(shí)現(xiàn)類,包括不限于ArrayBlockingQueue、LinkBlockingQueue,這兩個(gè)底層的數(shù)據(jù)結(jié)構(gòu)分別是數(shù)組和鏈表。數(shù)組查詢快,鏈表增刪快,能夠適應(yīng)大多數(shù)應(yīng)用場景。
3、 但是ArrayBlockingQueue、LinkBlockingQueue都是線程安全的。涉及到線程安全,就會(huì)有synchronized、lock等關(guān)鍵字,這就意味著CPU會(huì)打架。
4、 Disruptor一種線程之間信息無鎖的交換方式(使用CAS(Compare And Swap/Set)操作)。
3.2、Disruptor主要特點(diǎn)
1、 沒有競爭=沒有鎖=非??臁?
2、 所有訪問者都記錄自己的序號(hào)的實(shí)現(xiàn)方式,允許多個(gè)生產(chǎn)者與多個(gè)消費(fèi)者共享相同的數(shù)據(jù)結(jié)構(gòu)。
3、 在每個(gè)對(duì)象中都能跟蹤序列號(hào)(ring buffer,claim Strategy,生產(chǎn)者和消費(fèi)者),加上神奇的cache line padding,就意味著沒有為偽共享和非預(yù)期的競爭。
3.3、 Disruptor 核心技術(shù)點(diǎn)
Disruptor可以看成一個(gè)事件監(jiān)聽或消息機(jī)制,在隊(duì)列中一邊生產(chǎn)者放入消息,另外一邊消費(fèi)者并行取出處理.
底層是單個(gè)數(shù)據(jù)結(jié)構(gòu):一個(gè)ring buffer。
每個(gè)生產(chǎn)者和消費(fèi)者都有一個(gè)次序計(jì)算器,以顯示當(dāng)前緩沖工作方式。
每個(gè)生產(chǎn)者消費(fèi)者能夠操作自己的次序計(jì)數(shù)器的能夠讀取對(duì)方的計(jì)數(shù)器,生產(chǎn)者能夠讀取消費(fèi)者的計(jì)算器確保其在沒有鎖的情況下是可寫的。
核心組件
Ring Buffer 環(huán)形的緩沖區(qū),負(fù)責(zé)對(duì)通過 Disruptor 進(jìn)行交換的數(shù)據(jù)(事件)進(jìn)行存儲(chǔ)和更新。
Sequence 通過順序遞增的序號(hào)來編號(hào)管理通過其進(jìn)行交換的數(shù)據(jù)(事件),對(duì)數(shù)據(jù)(事件)的處理過程總是沿著序號(hào)逐個(gè)遞增處理。
RingBuffer底層是個(gè)數(shù)組,次序計(jì)算器是一個(gè)64bit long 整數(shù)型,平滑增長。
Ring Buffer 運(yùn)行的過程:
1、 接受數(shù)據(jù)并寫入到腳標(biāo)31的位置,之后會(huì)沿著序號(hào)一直寫入,但是不會(huì)繞過消費(fèi)者所在的腳標(biāo)。
2、 Joumaler和replicator同時(shí)讀到24的位置,他們可以批量讀取數(shù)據(jù)到30
3、消費(fèi)邏輯線程讀到了14的位置,但是沒法繼續(xù)讀下去,因?yàn)樗膕equence暫停在15的位置上,需要等到他的sequence給他序號(hào)。如果sequence能正常工作,就能讀取到30的數(shù)據(jù)。
總結(jié):
以上的一些內(nèi)容,只需要了解即可,目的還是為了能夠更好的理解Storm內(nèi)部的通信的原理,為今后的進(jìn)階之路打好基礎(chǔ)。
總結(jié)
以上是生活随笔為你收集整理的Storm的通信机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 读书笔记2014第12本:《创新者的窘境
- 下一篇: 【spider】多线程爬虫