是否可以将元组从一个拓扑发布到另一个拓扑?
让我们说在一个拓扑中,一个特定的螺栓正在将元组存储到db中。在另一种拓扑结构中,我不想复制或创建用于存储元组的相同螺栓。那么从第二个拓扑结构可以发射到第一个拓扑螺栓吗?
-Hariprasad
答案 0 :(得分:1)
虽然您无法直接将元组从一个拓扑传递到另一个拓扑,但您可以使用排队系统(如Apache Kafka)来完成您所描述的内容。 Storm在其最新版本中打包了Kafka喷口。
答案 1 :(得分:1)
设置需要两个风暴拓扑(A和B)和一个Kafka主题。我们称之为“转移”
在要将数据发送到B拓扑的A拓扑中,使用Kafka生产者:
[kafka初始化代码直接来自文档:https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+Producer+Example,显然需要为您的kafka安装进行自定义。]
public void Execute(Tuple input){
...
Properties props = new Properties();
props.put("metadata.broker.list", "broker1:9092,broker2:9092 ");
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("partitioner.class", "example.producer.SimplePartitioner");
props.put("request.required.acks", "1");
ProducerConfig config = new ProducerConfig(props);
Producer<String, String> producer = new Producer<String, String (config);
String msg = ...
KeyedMessage<String, String> data = new KeyedMessage<String, String>
("transfers", ip, msg);
producer.send(data);
producer.close();
从拓扑B,您在初始化拓扑时创建Kafka Spout:
BrokerHosts hosts = new ZkHosts(zkConnString);
SpoutConfig spoutConfig = new SpoutConfig(hosts, topicName, "/" + topicName,
UUID.randomUUID().toString());
spoutConf.scheme = new SchemeAsMultiScheme(new StringScheme());
KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);
// Now it's just like any other spout
topologyBuilder.setSpout(kafkaSpout);
这需要运行kafka,当然(请查看https://kafka.apache.org/08/quickstart.html)。
[编辑:再次阅读你的问题:听起来你有一个可重用的组件(保存元组),你想从两个不同的拓扑调用,而你试图从另一个调用一个。另一种方法是将此任务卸载到专用于处理保存元组的第三个拓扑,并仅创建需要在拓扑中保留的项目的kafka消息。这样,save-tuple的所有事件都将以相同的方式处理。]
答案 2 :(得分:0)
目前不支持此功能,您无法将元组从一个拓扑传递到另一个拓扑。 根据您的用例,为什么不使用订阅db bolt而不是运行单独拓扑的另一个螺栓(在同一拓扑内)