2017-05-26 48 views
0

我研究分佈式系統和參照這個老問題:stackoverflow link差保證

我實在不明白之間的差別,僅一次,在-最不曾經並且至多有一次保證,我在Kafka,Flink和Storm以及Cassandra中也閱讀了這些概念。比如有人說Flink更好,因爲它只有一次保證,而Storm只有至少一次。

我知道一次一次模式對延遲更好,但同時對容錯來說更糟?如果我沒有重複,如何恢復流?然後......如果這是一個真正的問題,爲什麼 - 一旦保證被認爲比其他人更好?

有人可以給我更好的定義嗎?

+1

看看[卡夫卡文檔的這一部分](http://kafka.apache.org/documentation.html#semantics),讓我們知道是否澄清了你的疑惑。 –

回答

1

下面定義從Akka文檔引用

在最多一次輸送

意味着對於交給機構的每個消息,該消息是 遞送零或一次;在更偶然的條件下,這意味着 消息可能會丟失。在-至少一次輸送

意味着對於交給機構潛在 多次嘗試以提供它製成的每個消息,以使得至少一個 成功;再次,更加隨便地說,這意味着消息可能是 重複但不會丟失。

僅一次輸送

意味着對於交給機構恰好一個 遞送到接收者做出的每個消息;該消息既不能丟失也不能複製。

第一個是性價比最高的性能,最少的實現開銷 - 因爲它可以在發送端或傳輸機制中保持狀態的情況下以完好無損的方式完成。第二個要求重試來抵消運輸損失,這意味着在發送端保持狀態並在接收端具有確認機制。第三個是最昂貴的,因此性能最差 - 因爲除了第二個之外,它需要狀態保持在接收端以便過濾掉重複傳送

1

Here積極文章值得閱讀。

我將盡力爲您解答:

  • 精確,曾經在大型分佈式系統不容錯, 因爲不可能所有系統上的每個消息同意如果 一些系統可能會失敗。你可以實現一次精確的,但它會至少在你自己昂貴的協調之上至少處理一次。想想 關於當底層IP協議不可靠時TCP如何確保可靠的數據傳輸。
  • 通過在至少一次的基礎上實現精確一次,在出現故障時您將會有重複(如果不是確切的話),並且您需要的是重複刪除。
  • 確切一次不被認爲更好,因爲它帶來高成本,而在大多數情況下至少一次是夠好的。
1

Flink使用這些術語來討論事件有申請狀態。假設我想在日常的窗口中使用標籤apache-flink計算帖子到stackoverflow。如果我正在使用,那麼只需確保一次,然後每個帖子將被計入一次,並且我的分析將100%正確,即使路上出現故障並且必須重新處理一些數據才能實現此目的。 Flink通過結合全局一致的快照和數據流重放來完成此任務。用至少一次,那麼如果出現故障,某些帖子可能會被計算兩次,但我保證每一篇帖子都將通過管道進行分析。並且最多一次在發生故障時不會有快照並且不會重播,如果出現問題,這將導致計數不足。

在正確性和容錯性方面,確切的一次是最優的,但是以犧牲一點附加延遲爲代價。

有關此主題的更深入的處理,請參閱數據Artisans - High-throughput, low-latency, and exactly-once stream processing with Apache Flink™ - 和documentation of Flink's internals的博客文章。