Я не понимаю, как бы я разделил поток в Apache Storm. Например, у меня есть болт А, который после некоторых вычислений имеет некоторое значение1, некоторое значение2 и некоторое значение3. Он хочет отправить somevalue1 на болт B, somevalue2 на болт C, а somevalue1, somevalue2 на болт D. Как я могу сделать это в Storm? Какую группу я бы использовал и как бы выглядела бы моя топология? Спасибо заранее за вашу помощь.
Как бы я разделил поток в Apache Storm?
Ответ 1
Вы можете использовать разные потоки, если ваш случай нуждается в этом, он не очень раскалывается, но у вас будет много гибкости, вы можете использовать его для маршрутизации на основе контента с помощью болта, например:
Вы объявляете поток в болте:
@Override
public void declareOutputFields(final OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declareStream("stream1", new Fields("field1"));
outputFieldsDeclarer.declareStream("stream2", new Fields("field1"));
}
Вы выбрасываете болт по выбранному потоку:
collector.emit("stream1", new Values("field1Value"));
Вы слушаете правильный поток через топологию
builder.setBolt("myBolt1", new MyBolt1()).shuffleGrouping("boltWithStreams", "stream1");
builder.setBolt("myBolt2", new MyBolt2()).shuffleGrouping("boltWithStreams", "stream2");
Ответ 2
У вас есть два варианта: Группы потоков и "Прямая группировка". В зависимости от ваших требований один из них будет вам служить.
Посмотрите пример образца WordCountTopology, чтобы узнать, что именно вы ищете. В противном случае "Direct Grouping" станет лучшей альтернативой.
Но опять же, выбор стратегии группировки зависит от ваших требований.