我正在研究分布式系统并参考这个老问题:stackoverflow link
我真的无法理解完全一次,至少一次和最多一次保证之间的区别,我在Kafka,Flink和Storm以及Cassandra中也读到了这些概念。例如,有人说Flink更好,因为只有一次保证,而Storm只有至少一次。
我知道,一次性模式对于延迟更好,但同时对于容错更糟糕吗?如果我没有重复,如何恢复流?然后......如果这是一个真正的问题,为什么一次保证被认为比其他保证更好?
有人可以给我更好的定义吗?
答案 0 :(得分:19)
以下定义引自Akka文档
最多一次 投放
表示对于传递给该机制的每条消息,该消息是 交付零次或一次;从更随意的角度来看,这意味着 消息可能会丢失。
至少一次 投放
意味着对于每个传递给机制的消息可能 在交付它时进行多次尝试,使得至少一次 成功;再次,在更随意的意义上,这意味着消息可能是 重复但没有丢失。
完全一次 投放
意味着每个传递给机制的消息恰好一个 交付给收件人;消息既不会丢失也不会丢失 复制。
第一个是性能最低,性能开销最低的 - 因为它可以以一种即发即忘的方式完成,而不会在发送端或传输机制中保持状态。第二个需要重试以对抗传输损耗,这意味着将状态保持在发送端并且在接收端具有确认机制。第三个是最昂贵的 - 因此性能最差 - 因为除了第二个之外,它需要将状态保留在接收端以便过滤掉重复的交付
答案 1 :(得分:3)
Here是值得阅读的积极的文章。
我会尽力回答你的问题:
答案 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
一次交货
对于许多关键系统,重复消息是不可接受的。的 消息传递系统确保每条消息准确传递一次 通过自动过滤可能的邮件重复项。
至少一次交付
如果失败导致消息丢失或花费太长时间 从中恢复,邮件将被重新传输以确保它们已传递 至少一次。