去掉storm可靠性有三種方式:
1、Config.TOPOLOGY_ACKERS 設(shè)置為0;
2、在發(fā)送數(shù)據(jù)時(shí)不帶上mesage id;
3、將tuple不做anchor發(fā)送到下一個(gè)節(jié)點(diǎn),因?yàn)闆](méi)有anchor到任何spout的tuple,就算沒(méi)有成功處理被ack,也不會(huì)造成tuple fail
如果設(shè)置storm的信息處理不需要可靠性保證,spout的等待隊(duì)列一直為空,因?yàn)闊o(wú)需緩存數(shù)據(jù)。
保證storm可靠性,需要構(gòu)建tuple樹,如果整個(gè)樹在規(guī)定超時(shí)時(shí)間內(nèi)不能沒(méi)有處理完成,則認(rèn)為是失敗。為保證tuple樹的構(gòu)造:
1.在Spout發(fā)送數(shù)據(jù)時(shí)帶上messageId(collector.emit(new Values(“test),msgId)),這樣,當(dāng)storm認(rèn)為該tuple被成功處理,將調(diào)用spout的ack方法,并將msgId傳給spout.
2.在每個(gè)bolt處理tuple的時(shí)候,因tuple樹需要生長(zhǎng),所以在bolt處理完tuple并發(fā)送數(shù)據(jù)的時(shí)候,需要通知storm在tuple樹添加新的鏈路,通過(guò)anchor即可,anchor鏈接一個(gè)節(jié)點(diǎn)時(shí),emit(tuple, new Value(“test”));如果需要同時(shí)鏈接兩個(gè)節(jié)點(diǎn),通過(guò)emit(List<Tupple>, new Value(“test”))
因?yàn)閟torm通過(guò)內(nèi)存追蹤元組的狀態(tài),所以需要保證可靠性時(shí),一定要ack或者fail,不然會(huì)耗盡內(nèi)存, messageId在發(fā)射數(shù)據(jù)時(shí),根據(jù)anchors去生成新的messageId.
實(shí)現(xiàn)Bolt有兩種方式,一種是實(shí)現(xiàn)IRichBolt,一種是繼承實(shí)現(xiàn)IBasicBolt的BasicBolt,在TopologyBuilder中,可以看到在調(diào)用setBolt的方法時(shí),對(duì)比兩種類型的實(shí)現(xiàn)方法:

在該方法中,直接將IRichBolt作為參數(shù)傳入topologyBuilder中初始化。
IBasicBolt:

將IBasicBolt包裝成BasicBoltExecutor,這個(gè)類中的execute方法將會(huì)自動(dòng)ack tuple,這也就是為什么繼承BasicBolt會(huì)自動(dòng)ack tuple而無(wú)需手動(dòng)ack:
