twitter storm源碼走讀之4 -- worker進程中線程的分類及用途

歡迎轉載,轉載請註明出版,徽滬一郎。java

本文重點分析storm的worker進程在正常啓動以後有哪些類型的線程,針對每種類型的線程,剖析其用途及消息的接收與發送流程。git

概述

worker進程啓動過程當中最重要的兩個函數是mk-workerworker-data,代碼就不一一列出了。worker順利啓動以後會擁有以下圖所示的各種線程。github

 

接收和發送線程

worker在啓動的時候會生成進程級別的消息接收和消息發送線程,它們視具體配置而定,能夠是基於zmq,也能夠基於netty,這個沒有太多好說的。socket connection的創建過程能夠在tuple消息傳遞一文中找到說明。api

zk client

worker須要按期的向zk server發送心跳消息,與zk server之間的鏈接處理就落到zk client這個線程身上了。具體代碼見函數do-heartbeat及do-executor-heartbeats。網絡

定時器線程

worker進程須要按期的作些事情,好比發送心跳消息,刷新socket鏈接,這些定時器歸爲以下幾類,每類定時器運行在各自的線程。socket

  1. :heartbeat-timer worker
  2. :refresh-connections-timer worker
  3. :refresh-active-timer worker
  4. :executor-heartbeat-timer worker
  5. :user-timer worker

 

上述定時器分類見於worker的shutdown函數,有時候在分析代碼的時候,若是從入口看不清楚的話,不妨試試從退出的處理邏輯哪裏找找答案。函數

SystemBolt

在topology提交的時候曾經見過函數system-topology!,這個函數會建立SystemBolt,每一個worker內有且只有一個SystemBolt,能夠見SystemBolt.java中註釋的說明或參考github上storm對該改變的說明,https://github.com/nathanmarz/storm/pull/517ui

SystemBolt主要進行進程相關的統計功能,好比內存使用狀況,網絡包的吞吐量,具體可見SystemBolt.java。SystemBolt是不接收tuple,只有出度,沒有入度。spa

Metrics Bolt線程

MetricsBolt主要也是處理統計工做,與systembolt不一樣的是,metricsbolt主要處理executor級別的,若是用戶在配置文件中定義了相關的MetricsConsumer類,那麼這些類會在此被執行。
線程

與之相關的配置內容,

## Metrics Consumers
# topology.metrics.consumer.register:
#   - class: "backtype.storm.metrics.LoggingMetricsConsumer"
#     parallelism.hint: 1
#   - class: "org.mycompany.MyMetricsConsumer"
#     parallelism.hint: 1
#     argument:
#       - endpoint: "metrics-collector.mycompany.org"

 

Shared Executor

這個是在storm 0.8中引入的,其用途可在0.8的release notes中找到,建立共享線程池,具體用途沒太搞清楚,:).

Metrics的執行流程

metrics所作的計量工做是在何時被喚醒的呢,也就是說如何一步步的觸發直到MetricsConsumeBolt的execute函數被調用。

下圖勾勒出與metrics相關的線程間的消息傳遞過程。

 

簡要說明以下

  1. worker在啓動的時候,會往:user-timer中註冊metrics timer(見setup-metrics!函數).
  2. 一旦metrics timer超時,會發送一個stream-id爲metrics-tick-stream-id的tuple到非metrics類型的bolt,如user/acker/system bolt.
  3. 接收到tuple以後,會調用metrics-tick函數發送task-data給MetricsConsumerBolt, stream-id爲metrics-stream-id
  4. MetricsConsumerBolt接收到stream-id爲metrics-stream-id的tuple後,會執行execute

注:在worker內部還有另外一套計量api,定義於builtin-metrics.clj中,與MetricsConsumerBolt的區別在於,builtin-metrics是在處理外部進程發送過來的tuple時進行計量統計,而MetricsConsumerBolt是定時觸發。

相關文章
相關標籤/搜索