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做什么并不重要