1. 程式人生 > >Storm原始碼閱讀(三):Thrift

Storm原始碼閱讀(三):Thrift

Defining Services

service Twitter {
// A method definition looks like C code. It has a return type, arguments,
void ping(),
// The 'oneway' modifier indicates that the client only makes a request and does not wait for any response at all.
    oneway void zip()
}

在strom.thrift中找到

service Nimbus {

  void submitTopology(1: string name, 2: stringuploadedJarLocation, 3: string jsonConf, 4: StormTopology topology) throws (1:AlreadyAliveException e, 2: InvalidTopologyException ite);

  void killTopology(1: string name) throws (1:NotAliveException e);

  void activate(1: string name) throws (1:NotAliveException e);

  string beginFileUpload();

  void uploadChunk(1: string location, 2:binary chunk);

  void finishFileUpload(1: string location);

  // returns json

  string getNimbusConf();

  // stats functions

  ClusterSummary getClusterInfo();

  TopologyInfo getTopologyInfo(1: string id)throws (1: NotAliveException e);

  //returns json

  string getTopologyConf(1: string id) throws(1: NotAliveException e);

  StormTopology getTopology(1: string id)throws (1: NotAliveException e);

  StormTopology getUserTopology(1: string id)throws (1: NotAliveException e);

}

客戶端:backtype.storm.generated.Nimbus的iface介面

伺服器端:backtype.storm.daemon.nimbus.cljservice-handler (reify Nimbus$Iface

Thrift network stack:

 

The Transport layer provides a simpleabstraction for reading/writing from/to the network. This enables Thrift todecouple the underlying transport from the rest of the system(serialization/deserialization, for instance).

//org.apache.thrift7.transport.TTransport

The Protocol abstraction defines a mechanism tomap in-memory data structures to a wire-format. In other words, a protocolspecifies how datatypes use the underlying Transport to encode/decodethemselves.

//org.apache.thrift7.protocol.TProtocol介面

A Processor encapsulates the ability toread data from input streams and write to output streams. The input and outputstreams are represented by Protocol objects.

//org.apache.thrift7.TProcessor

public interfaceTProcessor{
    bool process(TProtocol in, TProtocol out)throws TException
}

Service-specific processor implementations aregeneratedby the compiler. The Processor essentially reads data from the wire (using theinput protocol),delegatesprocessing to thehandler(implemented by the user) and writes theresponseover the wire (using the output protocol).

A Server pullstogether all of the various features described above:

·        Create a transport

·        Create input/outputprotocols for the transport

·        Create a processorbased on the input/output protocols

·        Wait for incomingconnections and hand them off to the processor

 伺服器端Server的程式碼:

(defnlaunch-server! [conf nimbus]

  (validate-distributed-mode! conf)

  (let[service-handler(service-handler confnimbus)

        options (->(TNonblockingServerSocket.(int(conf NIMBUS-THRIFT-PORT)))

                   (THsHaServer$Args.) //

                   (.workerThreads 64)->args.workerThreads

                    (.protocolFactory(TBinaryProtocol$Factory.))

                    (.processor(Nimbus$Processor. service-handler))

                   )

       server (THsHaServer. options)] ->newTHsHaServer(Args -> THsHaServer$Args)

 與網路棧的對應關係:

Server->THsHaServer

Processor -> Nimbus$Processor

Protocol ->TBinaryProtocol

Transport -> TNonblockingServerSocket

參考文件:

相關推薦

Storm原始碼閱讀Thrift

Defining Services service Twitter { // A method definition looks like C code. It has a return type, arguments, void ping(), // The 'o

ZooKeeper原始碼閱讀伺服器端

服務端入口:org.apache.zookeeper.server.QuorumPeerMain.main (呼叫ZooKeeperServerMain.main) 執行引數:配置檔案 如:QuorumPeerMain /opt/zookeeper/zookeeper-3

Storm筆記整理Storm集群安裝部署與Topology作業提交

大數據 實時計算 Storm [TOC] Storm分布式集群安裝部署 概述 Storm集群表面類似Hadoop集群。但在Hadoop上你運行的是”MapReduce jobs”,在Storm上你運行的是”topologies”。”Jobs”和”topologies”是大不同的,一個關鍵不同是

【筆記】ThreadPoolExecutor原始碼閱讀

執行緒數量的維護 執行緒池的大小有兩個重要的引數,一個是corePoolSize(核心執行緒池大小),另一個是maximumPoolSize(最大執行緒大小)。執行緒池主要根據這兩個引數對執行緒池中執行緒的數量進行維護。 需要注意的是,執行緒池建立之初是沒有任何可用執行緒的。只有在有任務到達後,才開始建立

Spring原始碼解析父子容器的概念

  相信大家現在在使用spring專案開發時可能不只是單單使用spring一個框架進行開發, 可能會用到現在主流的ssm,spring和springmvc一起使用。   而在一起使用的時候我就發現了一個問題,在web.xml配置spring容器初始化的時候存在一個問題。     一般我們在配置sprin

Dubbo原始碼分析Dubbo之服務端Service

         如上圖所示的Dubbo的暴露服務的過程,不難看出它也和消費者端很像,也需要一個像reference的物件來維護service關聯的所有物件及其屬性,這裡的reference就是provider。由於ServiceBean實現了  Initializ

OKHttp 3.10原始碼解析快取機制

本篇我們來講解OKhttp的快取處理,在網路請求中合理地利用本地快取能有效減少網路開銷,提高響應速度。HTTP報頭也定義了很多控制快取策略的域,我們先來認識一下HTTP的快取策略。 一.HTTP快取策略 HTTP快取有多種規則,根據是否需要向伺服器發起請求來分類,我們將其分為兩大類:強制

EventBus原始碼分析post方法釋出事件【獲取事件的所有訂閱者,反射呼叫訂閱者事件處理方法】2.4版本

EventBus維護了一個重要的HashMap,這個HashMap的鍵是事件,值是該事件的訂閱者列表,因此post事件的時候就能夠從此HashMap中取出事件的訂閱者列表,對每個訂閱者反射呼叫事件處理方法。 private final Map<Cla

ElasticSearch原始碼解析索引建立

我們先來看看索引建立的事例程式碼: Directory directory = FSDirectory.getDirectory("/tmp/testindex"); // Use standard analyzer Analyzer analyzer = new

ROS原始碼閱讀5ROS程式的初始化——對ros:init()的總結

https://blog.csdn.net/wanghuiquan0712/article/details/78052093 回顧 ros::init()是ROS程式呼叫的第一個函式,用於對ROS程式的初始化。該函式主要呼叫了以下五個函式對ROS程式進行初始化: network::init(

Flask原始碼閱讀——渲染模板

1.前面的例子中(第一篇),業務邏輯和表現邏輯混合在了一起,會導致程式碼難以理解和維護。因此, 把表現路基移到模板中能提升程式的可維護性。 例:使用者在網站仲註冊了一個新賬戶。使用者在變淡中輸入嗲子郵箱地址和密碼,然後點選提交按鈕。伺服器收到包含使用者輸入資料

Scrapy原始碼分析訊號管理器SignalManager

類的位置scrapy.signalmanager.SignalManager。主要是對pydispatch.dispatcher的一層封裝。 首先來看看pydispatch.dispatcher都有哪些功能:專案主頁 這個模組主要提供了訊息的傳送和接收功能,主頁的示例:

ORB-SLAM2的原始碼閱讀ORB特徵提取

怎麼讀一個工程?程式碼菜鳥不敢妄言。LZ也就嘗試化整為零,逐個擊破,再化零為整,全域性理解。下面程式碼來自ORB_SLAM2的ORBextractor.h和ORBextractor.cc.為什麼要寫這個部落格,因為笨,看程式碼怕忘了。自己寫一遍加深下記憶。為什麼

《Redis設計與實現》[第二部分]單機資料庫的實現-C原始碼閱讀

3、AOF持久化 關鍵字:AOF持久化:檔案寫入與同步,AOF檔案重寫,資料一致性 與RDB持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,AOF持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的 被寫入AOF檔案的所有命令都是以

DL4J原始碼閱讀LSTM梯度計算

    LSTMHelpers類中的backpropGradientHelper方法是梯度計算過程。         // 本層神經元個數         int hiddenLayerSize = recurrentWeights.size(0); //i.e., n^

DL4J原始碼閱讀梯度計算

      computeGradientAndScore方法呼叫backprop()做梯度計算和誤差反傳。       backprop()呼叫calcBackpropGradients()方法。calcBackpropGradients()方法再呼叫initGradie

dubbo遠端呼叫原始碼分析客戶端接收反饋後的處理

dubbo遠端呼叫的原始碼分析,分成了三篇文章地址分別如下:下面是consumer接收到provider反饋時的處理consumer接收到provider的反饋後,觸發NettyClient的事件處理器,該事件對consumer來說是上行事件,觸發的是NettyCodecAd

JVM 原始碼分析深入理解 CAS

前言什麼是 CASJava 中的 CASJVM 中的 CAS 前言 在上一篇文章中,我們完成了原始碼的編譯和除錯環境的搭建。 鑑於 CAS 的實現原理比較簡單, 然而很多人對它不夠了解,所以本篇將從 CAS 入手,首先介紹它的使用,然後分析它在 Hotsport 虛擬機器中的具體實現。 什麼是 CAS C

《Javascript高級程序設計》閱讀記錄第五章 上

面向對象的語言 none 括號 數量 mas ie9 驗證 ive .so   這個系列以往文字地址:   《Javascript高級程序設計》閱讀記錄(一):第二、三章   《Javascript高級程序設計》閱讀記錄(二):第四章   這個系列,我會把閱讀《Jav

課時17 第課Spark內部原理剖析與原始碼閱讀

為何spark shuffle比mapreduce shuffle慢? 主要是spark shuffle的shuffle read階段還不夠優秀,它是基於hashmap實現的,shuffle read會把shuffel write階段已經排序資料給重新轉成亂序的,轉成亂序之後又做了排序,導致非常低效,sp