本節書摘來自華章計算機《storm企業級應用:實戰、運維和調優》一書中的第3章,第3.1節,作者:馬延輝 陳書美 雷葆華著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
tuple是storm的主要資料結構,并且是storm中使用的最基本單元、資料模型和元組。
3.1.1 tuple描述
tuple就是一個值清單,tuple中的值可以是任何類型的,動态類型的tuple的f?ields可以不用聲明;預設情況下,storm中的tuple支援私有類型、字元串、位元組數組等作為它的字段值,如果使用其他類型,就需要序列化該類型。
tuple的字段預設類型有:integer、float、double、long、short、string、byte、binary(byte[])。
tuple資料結構如圖3-1所示。

tuple可以了解成鍵值對。例如,建立一個bolt要發送兩個字段(命名為double和triple),其中鍵就是定義在declareoutputfields方法中的fields對象,值就是在emit方法中發送的values對象。以下是一個簡單例子。
此外,在使用的storm java包中,backtype.storm.tuple主要有以下幾個類:
fileds.class。
messageid.class。
tuple.class。
tupleimpl.class。
values.class。
列出以上内容是為了更好地了解tuple,這樣能夠從本質上了解tuple,在使用時更加得心應手。
3.1.2 tuple的生命周期
了解一個tuple的生命周期就需要檢視源碼,如下的java代碼展示了spout(消息源)接口發出tuple(消息)的整個過程。
首先,storm調用spout(消息源)的nexttuple方法來擷取下一個tuple,spout通過open方法的參數提供的spoutoutputcollector将新tuple發射到其中一個輸出消息流。
發射tuple時,spout提供一個message-id,通過這個id來追蹤該tuple。
接下來,storm跟蹤該tuple的樹形結構是否成功建立,并根據messageid調用spout中的ack函數,以确認tuple是否被完全處理。如果tuple逾時,則調用spout的fail方法。
由此看出,同一個tuple不管是acked,還是failed都是由建立它的spout發出并維護的,是以,即使spout在叢集環境中同時執行很多的任務,該tuple也不會被其他任務調用或生成acked或failed狀态。總之,storm會利用内部的acker機制保證每個tuple被可靠地處理。最後,在任務完成後,spout調用close方法結束tuple的使命。