Apache 风暴可靠性:ack/fail 具有更改值的元组会保证可靠性吗?
Apache storm reliability: would ack/fail a tuple with changed values guarantee reliability?
我正在从事一个继承自定制遗留风暴螺栓的项目。螺栓应该是可靠的,它会根据某些操作的成功或失败来确认或失败 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);
}
}
这很可疑,因为它 acking/failing 是一个值已更改的元组。我找不到任何关于元组的键是否仅用于 acking 或键和值的文档。所以我的问题是:这样 ack/fail 是否可以保证可靠性(如果失败重试)?
没关系。 Storm 不跟踪元组内容。如果您想知道 Storm 如何跟踪元组,请查看 https://storm.apache.org/releases/2.0.0-SNAPSHOT/Guaranteeing-message-processing.html,尤其是 "How does Storm implement reliability in an efficient way?".
部分
该部分的 tl;dr 是 Storm 为整个元组树跟踪一个 64 位数字("ack val")。当你发出一个新元组(即树中的一条新边)时,Storm 为该边生成一个随机 id,并将其异或到 ack val 上。当边缘被接收螺栓确认时,相同的 ID 再次异或到确认值。由于 a XOR b XOR b
是 a
,当所有边都被处理时,Storm 以 ack val 为 0 结束。
由于 acking 仅取决于元组 ID(您没有理由想要更改),因此在 acking 之前对元组做了什么并不重要。
我正在从事一个继承自定制遗留风暴螺栓的项目。螺栓应该是可靠的,它会根据某些操作的成功或失败来确认或失败 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);
}
}
这很可疑,因为它 acking/failing 是一个值已更改的元组。我找不到任何关于元组的键是否仅用于 acking 或键和值的文档。所以我的问题是:这样 ack/fail 是否可以保证可靠性(如果失败重试)?
没关系。 Storm 不跟踪元组内容。如果您想知道 Storm 如何跟踪元组,请查看 https://storm.apache.org/releases/2.0.0-SNAPSHOT/Guaranteeing-message-processing.html,尤其是 "How does Storm implement reliability in an efficient way?".
部分该部分的 tl;dr 是 Storm 为整个元组树跟踪一个 64 位数字("ack val")。当你发出一个新元组(即树中的一条新边)时,Storm 为该边生成一个随机 id,并将其异或到 ack val 上。当边缘被接收螺栓确认时,相同的 ID 再次异或到确认值。由于 a XOR b XOR b
是 a
,当所有边都被处理时,Storm 以 ack val 为 0 结束。
由于 acking 仅取决于元组 ID(您没有理由想要更改),因此在 acking 之前对元组做了什么并不重要。