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

时间:2017-05-26 15:15:01

标签: cassandra apache-kafka apache-storm apache-flink

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

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

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

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

4 个答案:

答案 0 :(得分:19)

以下定义引自Akka文档

最多一次 投放

  

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

至少一次 投放

  

意味着对于每个传递给机制的消息可能   在交付它时进行多次尝试,使得至少一次   成功;再次,在更随意的意义上,这意味着消息可能是   重复但没有丢失。

完全一次 投放

  

意味着每个传递给机制的消息恰好一个   交付给收件人;消息既不会丢失也不会丢失   复制。

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

答案 1 :(得分:3)

Here是值得阅读的积极的文章。

我会尽力回答你的问题:

  • Exact-once在大型分布式系统中不具备容错能力, 因为所有系统都不可能就每条消息达成一致意见 一些系统可能会失败。你可以实现一次,但它会 在你自己代价高昂的协调下至少进行一次。认为 关于TCP如何在底层IP上确保可靠的数据传输 协议不可靠。
  • 通过在至少一次的情况下实现完全一次,如果出现故障,您将需要重复(如果不是确切的话),并且您需要重复删除。
  • 确切一次被认为不是更好,因为它带来了高成本,而在大多数情况下,至少一次就足够了。

答案 2 :(得分:3)

Flink使用这些术语来讨论事件对应用程序状态的影响。假设我试图在日常窗口中使用标记apache-flink将帖子计数到stackoverflow。如果我正在使用一次保证,那么每个帖子将只计算一次,我的分析将100%正确,即使在此过程中出现故障并且必须重新处理某些数据那发生了。 Flink通过全局一致的快照和流重放来实现这一目标。使用至少一次,如果失败,某些帖子可能会被计算两次,但我保证每个帖子都会被管道分析。最多只有一次,如果发生故障,将不会有快照,也不会重播,如果出现问题,将导致欠账。

在正确性和容错性方面,恰好一次是最佳的,但是会以一些额外的延迟为代价。

有关此主题的更深入处理,请参阅数据工匠 - High-throughput, low-latency, and exactly-once stream processing with Apache Flink™ - 以及documentation of Flink's internals中的此博客文章。

答案 3 :(得分:1)

我找到了一个不错的网站,其中简要讨论了所有(或大多数)Cloud Computing Patterns。我真的向您推荐它,看看:http://www.cloudcomputingpatterns.org

一次交货

  

对于许多关键系统,重复消息是不可接受的。的   消息传递系统确保每条消息准确传递一次   通过自动过滤可能的邮件重复项。

至少一次交付

  

如果失败导致消息丢失或花费太长时间   从中恢复,邮件将被重新传输以确保它们已传递   至少一次。