標籤:ping log 邏輯 概念 .com lse orm 兩種 ima
Strom架構基本概念就不提了,這裡主要講的是Stream
自訂ID的訊息流程。預設spout、bolt都需實現介面方法declareOutputFields
,代碼如下:
@Overridepublic void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declare(new Fields("body"));}
這種情況下發的訊息會被所有定義的bolts接收。我們如果需要根據得到的訊息類型來選擇不同的bolt,就需要用到Stream Grouping。
- 首先通過訊息源的
OutputFieldsDeclarer
來定義發射多條訊息流程stream
以下定義了兩種stream訊息流程:email郵件、sms簡訊
@Overridepublic void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declareStream("email", new Fields("body")); outputFieldsDeclarer.declareStream("sms", new Fields("body"));}
- 然後我們通過對訊息內容進行分析判斷來決定發射指定的stream類型
@Overridepublic void execute(Tuple tuple) { String streamType; String value = tuple.getStringByField("body"); # 邏輯判斷stub code if (value.startsWith("email:")) { streamType = "email"; } else { streamType = "sms"; } outputCollector.emit(streamType, new Values(value));}
- topology設定bolt的訊息源時通過localOrShuffleGrouping來設定只接收指定stream的訊息
FilterBolt通過對訊息進行加工處理,下發給bolts時會指定不同的stream,EmailNotifyBolt只接收email
類型的stream訊息,SmsNotifyBolt只接收sms
類型的stream訊息。
TopologyBuilder topologyBuilder = new TopologyBuilder();topologyBuilder.setSpout("RabbitmqSpout", new RabbitmqSpout());topologyBuilder.setBolt("FilterBolt", new FilterBolt()).shuffleGrouping("RabbitmqSpout");topologyBuilder.setBolt("EmailNotifyBolt", new EmailNotifyBolt()).localOrShuffleGrouping("FilterBolt", "email");topologyBuilder.setBolt("SmsNotifyBolt", new SmsNotifyBolt()).localOrShuffleGrouping("FilterBolt", "sms");
Storm架構:如何根據業務條件選擇不同的bolt進行下發訊息