Java Apache storm可靠性:具有更改值的元组的确认/失败会保证可靠性吗?
我正在从事一个项目,该项目继承了定制的传统风暴螺栓。螺栓应该是可靠的,并且根据某些操作的成功或失败来确认Java Apache storm可靠性:具有更改值的元组的确认/失败会保证可靠性吗?,java,apache-storm,Java,Apache Storm,我正在从事一个项目,该项目继承了定制的传统风暴螺栓。螺栓应该是可靠的,并且根据某些操作的成功或失败来确认元组。问题在于,在转换过程中,元组值会发生更改。示例代码: public void execute(Tuple tuple) { object newValues = transformTuple(tuple); tuple.getValues().set(0, newValues); try { // some other operation ... co
元组
。问题在于,在转换过程中,元组值会发生更改。示例代码:
public void execute(Tuple tuple) {
object newValues = transformTuple(tuple);
tuple.getValues().set(0, newValues);
try {
// some other operation
...
collector.ack(tuple);
} catch (Exception e) {
collector.fail(tuple);
}
}
这是可疑的,因为它正在确认/失败具有更改值的元组。我找不到任何文档说明是在确认中只使用元组的键,还是同时使用键和值。所以我的问题是:这样的确认/失败是否能保证可靠性(失败后重试)?这无关紧要。Storm不跟踪元组内容。如果您想知道Storm是如何跟踪元组的,请特别关注“Storm如何以有效的方式实现可靠性?”一节 tl;该部分的dr是Storm跟踪整个元组树的一个64位数字(“ack val”)。当您发出一个新元组(即树中的一条新边)时,Storm会为该边生成一个随机id,并将其XOR到ack val上。当接收螺栓确认该边时,该id将再次XOR到ack val上。由于
a XOR b XOR b
是a
,因此在处理所有边时,Storm最终的ack val为0
由于acking只依赖于tuple id(您没有理由要更改),所以在acking之前对tuple做什么并不重要