Storm的通訊機制

  • 目錄
    • 前言:
    • 一、Worker進程間通訊原理
    • 二、Worker進程間技術(Netty、ZeroMQ)
    • 三、Worker 內部通訊技術(Disruptor)
    • 總結:

 

目錄

前言:

這篇文章,博客主要介紹下Storm中Worker進程間和進程內部通訊的原理和技術。整篇內容僅供瞭解,若有不足或錯誤請指出。
Worker間的通訊常常須要經過網絡跨節點進行,Storm使用ZeroMQ或Netty(0.9之後默認使用)做爲進程間通訊的消息框架。
Worker進程內部通訊:不一樣worker的thread通訊使用LMAX Disruptor來完成。
不一樣topologey之間的通訊,Storm不負責,須要本身想辦法實現,例如使用kafka等。編程

一、Worker進程間通訊原理

worker進程間消息傳遞機制,消息的接收和處理的大概流程見下圖api


這裏寫圖片描述

一、對於worker進程來講,爲了管理流入和傳出的消息,每一個worker進程有一個獨立的接收線程<一個worker進程運行一個專用的接收線程來負責將外部發送過來的消息移動到對應的executor線程的incoming-queue中>(對配置的TCP端口supervisor.slots.ports進行監聽)對應Worker接收線程,每一個worker存在一個獨立的發送線程(transfer-queue的每一個元素實際上表明一個tuple的集合) ,它負責從worker的transfer-queue中讀取消息,並經過網絡發送給其餘worker。
二、每一個executor有本身的incoming-queue 和outgoing-queue 。
Worker接收線程將收到的消息經過task編號傳遞給對應的executor(一個或多個)的incoming-queues;
每一個executor有單獨的線程分別來處理spout/bolt的業務邏輯,業務邏輯輸出的中間數據會存放在outgoing-queue中,當executor的outgoing-queue中的tuple達到必定的閥值,executor的發送線程將批量獲取outgoing-queue中的tuple,併發送到transfer-queue中。
三、每一個worker進程控制一個或多個executor線程,用戶可在代碼中進行配置。其實就是咱們在代碼中設置的併發度個數。數組

總結:每一個work都有對應的接受線程用來經過網絡接收外部發送過來的消息,並根據tuple中包含的taskId匹配到對應的excutor,將該消息移動到對應的excutor線程的incoming-queue裏面,excutor從incoming-queue裏面拿數據進行處理後(經過bolt的excute方法來消費incoming-queue中的tuple數據),將中間結果輸出到outgoing-queue中,當outgoing-queue中的數據達到必定的閾值以後,excutor的發送線程會將outgoing-queue中的數據發送到worker的transfer-queue中,而worker的發送線程再將transfer-queue中讀到的消息經過網絡發送給其餘的worker.安全

二、Worker進程間技術(Netty、ZeroMQ)

2.一、Netty
Netty是一個NIO client-server(客戶端服務器)框架,使用Netty能夠快速開發網絡應用,例如服務器和客戶端協議。Netty提供了一種新的方式來使開發網絡應用程序,這種新的方式使得它很容易使用和有很強的擴展性。Netty的內部實現時很複雜的,可是Netty提供了簡單易用的api從網絡處理代碼中解耦業務邏輯。Netty是徹底基於NIO實現的,因此整個Netty都是異步的。
書籍:Netty權威指南服務器

2.二、ZeroMQ
ZeroMQ是一種基於消息隊列的多線程網絡庫,其對套接字類型、鏈接處理、幀、甚至路由的底層細節進行抽象,提供跨越多種傳輸協議的套接字。ZeroMQ是網絡通訊中新的一層,介於應用層和傳輸層之間(按照TCP/IP劃分),其是一個可伸縮層,可並行運行,分散在分佈式系統間。
ZeroMQ定位爲:一個簡單好用的傳輸層,像框架同樣的一個socket library,他使得Socket編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ的明確目標是「成爲標準網絡協議棧的一部分,以後進入Linux內核」。網絡

三、Worker 內部通訊技術(Disruptor)

3.一、Disruptor的來歷數據結構

  • 一個公司的業務與技術的關係,通常能夠分爲三個階段。第一個階段就是跟着業務跑。第二個階段是經歷了幾年的時間,才達到的驅動業務階段。第三個階段,技術引領業務的發展乃至企業的發展。因此咱們在學習Disruptor這個技術時,不得不提LMAX這個機構,由於Disruptor這門技術就是由LMAX公司開發並開源的。
  • LMAX是在英國註冊並受到FSA監管(監管號碼爲509778)的外匯黃金交易所。LMAX也是歐洲第一家也是惟一一家採用多邊交易設施Multilateral
    Trading Facility(MTF)擁有交易所牌照和經紀商牌照的歐洲頂級金融公司
  • LAMX擁有最迅捷的交易平臺,頂級技術支持。LMAX交易所使用「(MTF)分裂器Disruptor」技術,能夠在極短期內(通常在3百萬秒之一內)處理訂單,在一個線程裏每秒處理6百萬訂單。全部訂單均爲撮合成交形式,無一例外。多邊交易設施(MTF)曾經用來設計倫敦證券交易所(london Stock Exchange)、德國證券及衍生工具交易所(Deutsche Borse)和歐洲證券交易所(Euronext)。
  • 2011年LMAX憑藉該技術得到了金融行業技術評選大賽的最佳交易系統獎和甲骨文「公爵杯」創新編程框架獎。

3.二、Disruptor是什麼
一、 簡單理解:Disruptor是一個QueueDisruptor是實現了「隊列」的功能,並且是一個有界隊列(長度有限)。而隊列的應用場景天然就是「生產者-消費者」模型。
二、 在JDK中Queue有不少實現類,包括不限於ArrayBlockingQueue、LinkBlockingQueue,這兩個底層的數據結構分別是數組和鏈表。數組查詢快,鏈表增刪快,可以適應大多數應用場景。
三、 可是ArrayBlockingQueue、LinkBlockingQueue都是線程安全的。涉及到線程安全,就會有synchronized、lock等關鍵字,這就意味着CPU會打架
四、 Disruptor一種線程之間信息無鎖的交換方式(使用CAS(Compare And Swap/Set)操做)。
3.二、Disruptor主要特色
一、 沒有競爭=沒有鎖=很是快。
二、 全部訪問者都記錄本身的序號的實現方式,容許多個生產者與多個消費者共享相同的數據結構。
三、 在每一個對象中都能跟蹤序列號(ring buffer,claim Strategy,生產者和消費者),加上神奇的cache line padding,就意味着沒有爲僞共享和非預期的競爭。
3.三、 Disruptor 核心技術點
Disruptor能夠當作一個事件監聽或消息機制,在隊列中一邊生產者放入消息,另一邊消費者並行取出處理.
底層是單個數據結構:一個ring buffer。
每一個生產者和消費者都有一個次序計算器,以顯示當前緩衝工做方式。
每一個生產者消費者可以操做本身的次序計數器的可以讀取對方的計數器,生產者可以讀取消費者的計算器確保其在沒有鎖的狀況下是可寫的。多線程

核心組件
Ring Buffer 環形的緩衝區,負責對經過 Disruptor 進行交換的數據(事件)進行存儲和更新。
Sequence 經過順序遞增的序號來編號管理經過其進行交換的數據(事件),對數據(事件)的處理過程老是沿着序號逐個遞增處理。
RingBuffer底層是個數組,次序計算器是一個64bit long 整數型,平滑增加。
這裏寫圖片描述
Ring Buffer 運行的過程:
一、 接受數據並寫入到腳標31的位置,以後會沿着序號一直寫入,可是不會繞過消費者所在的腳標。
二、 Joumaler和replicator同時讀到24的位置,他們能夠批量讀取數據到30
三、消費邏輯線程讀到了14的位置,可是無法繼續讀下去,由於他的sequence暫停在15的位置上,須要等到他的sequence給他序號。若是sequence能正常工做,就能讀取到30的數據。併發

總結:

以上的一些內容,只須要了解便可,目的仍是爲了可以更好的理解Storm內部的通訊的原理,爲從此的進階之路打好基礎。框架

相關文章
相關標籤/搜索