确切一次和至少一次保证之间的差异

Aki*_*inn 13 cassandra apache-kafka apache-storm apache-flink

我正在研究分布式系统并参考这个老问题:stackoverflow链接

我真的无法理解完全一次,至少一次和最多一次保证之间的区别,我在Kafka,Flink和Storm以及Cassandra中也读到了这些概念.例如有人说Flink更好,因为只有一次保证,而Storm只有至少一次.

我知道,一次性模式对延迟更好,但同时对于容错更糟糕吗?如果我没有重复,如何恢复流?然后......如果这是一个真正的问题,为什么一次保证被认为比其他保证更好?

有人可以给我更好的定义吗?

Ami*_*mar 26

以下定义引自Akka Documentation

最多一次 交付

意味着对于传递给机制的每条消息,该消息被传递零次或一次; 从更随意的角度来看,这意味着消息可能会丢失.

至少一次 交付

意味着对于传递给该机制的每个消息,可能在交付它时进行多次尝试,使得至少一次成功; 再次,从更随意的角度来看,这意味着消息可能会重复但不会丢失.

准确一次 交货

意味着对于递交给机制的每个消息,只有一个传递给接收者; 消息既不会丢失也不会重复.

第一个是最便宜的最高性能,最少的实现开销 - 因为它可以以一种即发即忘的方式完成,而不会在发送端或传输机制中保持状态.第二个需要重试以对抗传输损耗,这意味着将状态保持在发送端并且在接收端具有确认机制.第三个是最昂贵的 - 并且因此具有最差的性能 - 因为除了第二个之外它还需要将状态保持在接收端以便过滤掉重复的交付


vol*_*var 5

是一篇值得一读的激进文章。

我会尽量回答你的问题:

  • Exact-once 在大型分布式系统中不是容错的,因为如果某些系统可能发生故障,则所有系统不可能就每条消息达成一致。您可以只实施一次,但至少需要您自己进行一次昂贵的协调。想想当底层 IP 协议不可靠时,TCP 如何确保可靠的数据传输。
  • 通过在至少一次之上实现精确一次,您将有重复(如果不是精确的),以防万一失败,您需要的是重复数据删除。
  • Exact-once 并不被认为更好,因为它带来了高成本,而 at-least-once 在大多数情况下就足够了。