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网页在线观看 | 日本黄色网址视频 | 日韩免费一级片 | 夜色伊人 | 成人国产激情福利久久精品 | 久久伊人在 | 黄色精品 | 日韩视频一区二区三区 | 26uuu欧美视频在线观看 | 日本人69视频jizz免费看 | 国产萝控精品福利视频免费观看 | 日韩伦理免费在线观看 | 一区二区三区在线免费看 | 国产精品久久久久久免费 | 午夜寂寞少妇aaa片毛片 | 精品久久久久区二区8888 | 999热在线精品观看全部 | 秋霞影院精品久久久久 | JLZZJLZZ亚洲乱熟在线播放 | 欧美一级久久 | 三级视频在线播放 | 日韩精品久久久久久久电影 | 国内精品一区二区 | 99中文在线 | 国产羞羞网站 | 日韩激情中文字幕一区二区 | 午夜亚洲精品 | 欧美大码毛片在线播放 | 亚洲看| 久久在线播放 | 久久97精品久久久久久久看片 | 久久亚洲这里只有精品18 | 狠狠草视频 | 亚洲一区和二区 | 国产欧美日韩在线观看 |