像 StreamScope 这样的一些系统要求函数是确定性的(以及它们的处理顺序),这是因为每个消息在流中都有其序列号。在失败的情况下,此序列号用于确定是否应该重新计算事件(因为它是由流持续存在的),因此下游节点不会两次计算相同的事件。
Flink、Spark Streaming、Kafka-Streams 和 Storm 是否也要求函数具有确定性?
像 StreamScope 这样的一些系统要求函数是确定性的(以及它们的处理顺序),这是因为每个消息在流中都有其序列号。在失败的情况下,此序列号用于确定是否应该重新计算事件(因为它是由流持续存在的),因此下游节点不会两次计算相同的事件。
Flink、Spark Streaming、Kafka-Streams 和 Storm 是否也要求函数具有确定性?
是和不是。这取决于 ;)
这些框架不会强迫您提供确定性功能。
如果发生故障,您的输入数据的某些部分将被重新计算。中间结果将被丢弃。因此,如果您使用非确定性函数,新生成的中间结果可能与前一个(失败之前)不同。但是,如果您不关心这一点,则可以使用非确定性。
此外,它取决于您使用的语义。
Flink/Storm(Trident)/Spark (exactly-once processing):
Flink/Storm/Kafka-Streams(至少一次处理):