我有一个拓扑并在本地模式下运行它,比如spout a
-->bolt
-->boltC
。而且,我定义了一个对象对象D
,它是从B到C发出的值。我有两个问题:
bolt b
中设置topology_tick_tuple_freq_secs
并在创建bolt b
时设置新的对象d
。当TupleHelpers.isTickTuple(input)
为true
时,它将对象D
发送到螺栓C
。我认为Storm会克隆对象D
并在bolt c
中生成一个新的,然而,当我试图更新对象D
的内容时,它仍然在bolt c
中发生变化。为什么?这两个bolt可能位于不同的服务器中,并且不可能在多个bolt之间共享内存中的相同变量。private final UserPreferBean userPrefer;
public FirstBolt() {
this.keyword = "Default";
this.userPrefer = new UserPreferBean();
this.userPrefer.setAction("Action");
this.userPrefer.setActor("Actor");
}
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
if (TupleHelpers.isTickTuple(input)) {
System.out.println("FirstBolt.Tick.keyword= " + userPrefer.getAction());
collector.emit(new Values(userPrefer));
} else {
}
}
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
UserPreferBean userPrefer = (UserPreferBean) input.getValue(0);
System.out.println("SecondBolt.keyword= " + userPrefer.getAction());
userPrefer.setAction("NewAction");
System.out.println("SecondBolt.new.keyword= " + userPrefer.getAction());
}
对于您的第一个问题,您应该为每个发出的元组数据添加新的元组数据,因为在您想要发出另一个元组之前,不能保证这些数据将被序列化以用于传输。如果不这样做,您可能会在以前发出但未提交的元组上打戳。至于bolt C得到的对象与bolt B发出的对象相同,我猜这只是当两个bolt在同一个JVM中时,Storm使用的性能技巧。如果这两个对象在不同的机器上,您显然不会得到这一点。这是另一个要发射新对象的原因。
对于您的第二个问题,TOPOLOGY_TICK_TUPLE_FREQ_SECS配置用于向您的bolt发送额外的tick元组--高于或超过通过上游bolt发送到bolt的任何其他元组。这意味着您可以将tick元组发送到任何数量的组件,只要它对您的拓扑设计有意义。
(xpost github问题) 这是我目前为止的尝试。我想我有一些配置错误,因为我知道我的正在发射事件,但我的Storm UI显示没有喷出发射。 我想也许我不应该在spout函数中绑定监听器? 该函数是否被多次调用?(看起来像是...参见https://github.com/rallysoftware/node-storm/blob/master/lib/spout.js#L4)
关于拓扑结构的说明: 喷口连续向读取螺栓发送元组。 读取bolt过程并将结果发送给下一个bolt等等。 在R bolt中处理tuple1之后还是在readbolt发送tuple1写入bolt之后?
对于我的拓扑--我在一个任务上的负载为90%,而第二个任务的负载为0%。 为什么对多个工人来说这是不同的。