Storm進程通信機制分析

    本文主要分析storm的worker進程間消息傳遞機制,消息的接收和處理的大概流程見下圖

    wKiom1R_wYTi7LFAAAGUYWQxTAQ123.jpg    

    

    在Storm中,worker進程內部的thread通信與worker進程間的通信有一些差別,worker間的通信經常需要通過網絡跨節點進行,Storm使用ZeroMQ或Netty(0.9以後默認使用)作爲進程間通信的消息框架。worker進程內部通信或在同一個節點的不同worker的thread通信使用LMAX Disruptor來完成。

    對於worker進程來說,爲了管理流入和傳出的消息,每個worker進程有一個獨立的接收線程(對配置的TCP端口supervisor.slots.ports進行監聽)。參數topology.receiver.buffer.size代表接收線程一次最多能接收多少條消息,用戶可以自定義配置。接收線程將收到的消息傳遞給對應的executor(一個或多個)的incoming-queues。對應接收線程,每個worker存在一個獨立的發送線程,它負責從worker的transfer-queue中讀取消息,並通過網絡發送給其他worker,transfer-queue的大小由參數topology.transfer.buffer.size來設置。transfer-queue的每個元素實際上代表一個tuple的集合,當executor的outgoing-queue中的tuple達到一定的閥值,executor的發送線程將批量獲取outgoing-queue中的tuple,併發送到transfer-queue中。

    每個worker進程控制一個或多個executor線程,用戶可在代碼中進行配置。每個executor有自己的incoming-queue和outgoing-queue。一個worker進程運行一個專用的接收線程來負責將外部發送過來的消息移動到對應的executor線程的incoming-queue中,executor中的發送線程在outgoing-queue到達一定的閥值後,將outgoing-queue中的消息批量發送給所在worker的transfer-queue。executor的incoming-queue和outgoing-queue的大小用戶可以自定義配置。每個executor有單獨的線程分別來處理spout/bolt的業務邏輯和從outgoing-queue消費數據併發送到transfer-queue中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章