Apache storm Storm-拓扑到拓扑

Apache storm Storm-拓扑到拓扑,apache-storm,Apache Storm,从一个拓扑向另一个拓扑发送元组是可能的还是可以的 假设在一个拓扑中,一个特定的螺栓将元组存储到db中。在另一个拓扑中,我不想复制或创建用于存储元组的相同螺栓。那么从第二个拓扑我可以发射到第一个拓扑吗 -Hariprasad目前不支持此功能,您无法将元组从一个拓扑传递到另一个拓扑。 根据您的用例,为什么不使用订阅db bolt的另一个bolt(在同一拓扑中)而不是运行单独的拓扑呢?当您无法直接将元组从一个拓扑传递到另一个拓扑时,您可以使用队列系统(如Apache Kafka)来完成您所描述的任务。

从一个拓扑向另一个拓扑发送元组是可能的还是可以的

假设在一个拓扑中,一个特定的螺栓将元组存储到db中。在另一个拓扑中,我不想复制或创建用于存储元组的相同螺栓。那么从第二个拓扑我可以发射到第一个拓扑吗


-Hariprasad

目前不支持此功能,您无法将元组从一个拓扑传递到另一个拓扑。
根据您的用例,为什么不使用订阅db bolt的另一个bolt(在同一拓扑中)而不是运行单独的拓扑呢?

当您无法直接将元组从一个拓扑传递到另一个拓扑时,您可以使用队列系统(如Apache Kafka)来完成您所描述的任务。Storm在其最新版本中包装了卡夫卡喷口

设置需要两个storm拓扑(A和B)和一个Kafka主题。我们称之为“转移”

在要向B拓扑发送数据的A拓扑中,使用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();
当然,这需要运行卡夫卡

[编辑:再次阅读您的问题:听起来您有一个可重用组件(保存元组)您希望从两个不同的拓扑中调用,并且尝试从另一个拓扑中调用。另一种方法是将此任务卸载到第三个拓扑中,该拓扑专门用于处理保存元组,并且只创建需要在拓扑中持久化的项的kafka消息。这样,保存元组的所有事件都将由sa处理我的方式。]

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);