Apache风暴可靠性:使用更改值保证可靠性的元组是否会失败?

时间:2018-05-30 16:25:24

标签: java apache-storm

我正在开发一个继承自定制传统风暴螺栓的项目。螺栓应该是可靠的,并且根据某些操作的成功或失败,它会使tuple无效或失败。问题是在转换中,元组值会发生变化。示例代码:

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

这是可疑的,因为它使用更改的值来修饰/失败元组。我无法找到任何关于是否只在元组中使用元组的键或者键和值的文档。所以我的问题是:这样的ack / fail是否会保证可靠性(如果失败则重试)?

1 个答案:

答案 0 :(得分:2)

没关系。 Storm不会跟踪元组内容。如果您想知道Storm如何跟踪元组,请查看issue,特别是“#34; Storm如何以有效的方式实现可靠性?"。

该部分的tl; dr是Storm跟踪整个元组树的一个64位数字(" ack val")。当您发出新元组(即树中的新边)时,Storm会为该边生成一个随机ID,并将其与ack val进行异或。当边缘被接收螺栓敲击时,相同的ID再次异步到ack val。由于a XOR b XOR ba,因此当处理完所有边时,Storm会以ack val为0结束。

由于acking只取决于元组id(你没有理由想要改变),所以在对它进行处理之前你对元组的处理并不重要。