emit(Listtuple,ObjectmessageId){returnemit(Utils.DEFAULT_STREAM_ID,tuple,messageId);}這里的t" />

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

理解Storm可靠性消息

系統(tǒng) 2160 0

看過一些別人寫的, 感覺有些東西沒太說清楚,個(gè)人主要以源代碼跟蹤,參考個(gè)人理解講述,有錯(cuò)誤請指正。

1基本名詞

1.1 Tuple: 消息傳遞的基本單位。很多文章中介紹都是這么說的, 個(gè)人覺得應(yīng)該更詳細(xì)一點(diǎn)。

?在spout發(fā)送的時(shí)候,函數(shù)原型

?public List<Integer> emit(List<Object> tuple, Object messageId) {
??????? return emit(Utils.DEFAULT_STREAM_ID, tuple, messageId);
??? }

這里的tuple, 實(shí)際上是List<Object> 對象,返回的是 List<Integer> 是要發(fā)送的tast的IdsList

在bolt接收的時(shí)候, 函數(shù)原型

public void execute(Tuple tuple)

變成了一個(gè)Tuple對象,? 結(jié)構(gòu)應(yīng)該也是一個(gè)list, List<Field1, value1, Field2, value2..>這樣的一個(gè)結(jié)構(gòu), FieldList ValueList, 我們根據(jù)對應(yīng)的fieldname就可以取出對應(yīng)的getIntegerByField方法

回到spout對象中來, 在spout有一個(gè)定義的輸出字段

??? public void declareOutputFields(OutputFieldsDeclarer declarer) {
?? ??? ?declarer.declare(new Fields("word"));
?? ?}

這里定義的一個(gè)字段,所以我們在emit的時(shí)候就只能發(fā)送一個(gè)包含一個(gè)value的tuple(spout部分), storm會將field, 和 發(fā)送的value下標(biāo)對應(yīng), 變成一個(gè)Tuple對象,? 也就是上面說的

List<Field1, value1, Field2, value2..>這樣的一個(gè)結(jié)構(gòu),? 在bolt 之間傳遞tuple, 發(fā)送又是List<Object> tuple, 根據(jù)組裝bolt定義的fiels, 再組合成Tuple對象給下一個(gè)Bolt處理

在發(fā)射的最后 還有一個(gè) void emitDirect(int taskId, String streamId, List<Object> tuple, Object messageId);? 因?yàn)樯厦鎒mit的時(shí)候已經(jīng)返回List<taskid>, 所以它就知道要發(fā)送給哪些taskid處理,然后將taskid 和 tuple放入隊(duì)列 LinkedBlockingQueue , 代碼如下

; worker.clj

( defn mk-transfer- fn [ transfer-queue ]

( fn [ task ^Tuple tuple ]

(.put ^LinkedBlockingQueue

transfer-queue [ task tuple ] )

))
然后單獨(dú)會開啟一個(gè)叫async-loop的線程,取出每條記錄(taskid, tuple), 然后worker會從當(dāng)前task建立一個(gè)到目標(biāo)task的zeromq連接, 通過zeromq將tuple發(fā)送給目標(biāo)task
?

總結(jié): 每次emit都是根據(jù)List<Object>和定義的輸出Fields組合成一個(gè)Tuple對象,,每個(gè)接受對象接收的是Tuple對象,如果處理完再發(fā)送又再組合字段, 在emit的時(shí)候返回LIst<taskids>,所以就知道發(fā)送給哪些Task, 然后拿這些taskid和tuple再組合成一個(gè)任務(wù)隊(duì)列,通過zeromq發(fā)送到目標(biāo)task,目標(biāo)task接收到tuple進(jìn)程處理至于并發(fā)度控制, 參考

      http://www.cnblogs.com/chengxin1982/p/4001275.html


    

?

TupleID Tuple對應(yīng)的ID,? 在創(chuàng)建的時(shí)候賦予一個(gè)64位的id,主要用來跟蹤消息

MsgID? 官方解釋 Emits a new tuple to the default output stream with the given message ID. 如果不指定,acker不會跟蹤。主要作用 , 在spout收到fail時(shí)候, 能夠定位到是哪條消息出錯(cuò),能夠決定重發(fā). 使用實(shí)例? _collector.emit(new Values(sentence),? new Integer(num));

acker 消息跟蹤者. acker 存儲一個(gè)Map<taskid, ack val> ,? taskid為祖宗tuple創(chuàng)建者的taskid ,? ack_val 為消息傳遞過程中的 tupleid的xor值,如果為0則知道是哪個(gè)spout或者bolt已經(jīng)處理完了, 為什么會有bolt, 因?yàn)閎olt在發(fā)射的時(shí)候,如果非錨定,就是不帶tuple發(fā)射,它會被認(rèn)為是祖宗tuple, 上一個(gè)tuple會認(rèn)為已經(jīng)結(jié)束.
至于分配發(fā)射源分配到acker, storm采用一致性hash 祖宗tupleid來分配,因?yàn)樵谒械膖uple中都能知道祖宗tupleid,所以在子孫tuple處理時(shí), 知道該發(fā)送給哪個(gè)acker跟蹤

?

理解Storm可靠性消息


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 91看视频 | 天天操网 | 亚洲欧美一区二区三区另类 | 久久中文字幕一区二区 | 国产精品综合色区在线观看 | 欧美一区在线观看视频 | 91在线观看网站 | a毛片视频 | 玖玖精品| 精品国产一区二区国模嫣然 | 亚洲天堂视频在线观看 | 免费日本视频 | 四虎影片| 中国字幕av| 国产成人精品福利站 | 亚洲成av人片在线观看 | 高清在线一区二区 | 2022国内精品免费福利视频 | 亚洲欧美国产一区二区三区 | 亚洲偷| 日韩欧美在线免费观看 | 二区在线视频 | 亚洲精品久久久久久国产精华液 | 成人午夜精品视频在线观看 | 亚洲视频免费 | 91华人在线视频 | 天天天天 | 亚洲精品中文字幕大岛优香 | 日本精品二区 | 日本黄色片一级片 | 国产一区精品视频 | 深夜毛片 | 黄色av片在线观看 | 成人爱爱电影 | 特级毛片免费观看视频 | 国产精品爱啪在线线免费观看 | 日本高清视频网址 | 久久精品国产99久久久古代 | 亚洲一区二区三区影院 | 青青草成人免费视频在线 | 68久久久久欧美精品观看 |