原作者為 Ivan Kelly赏参。經(jīng)作者許可,我們對博客進行翻譯并發(fā)布沿盅。
人們在探討流處理引擎(stream processing engine, SPE)時把篓,經(jīng)常會提到 effectively-once(或 exactly-once)保證。一般情況下腰涧,較大的數(shù)據(jù)管道包含多個組件韧掩,而管道中的任何組件都有可能發(fā)生故障,SPE 通常只是其中一個小組件窖铡。如果用戶希望數(shù)據(jù)管道提供 effectively-once 保證疗锐,則管道中的其他(非 SPE)組件需要提供相應的保證。
本文介紹 Apache Pulsar 可以實現(xiàn)的保證類型费彼,以及實現(xiàn)保證的方式滑臊。
下圖為字數(shù)統(tǒng)計應用程序示例:
如上圖所示,首先來自數(shù)據(jù)源(如 Twitter Firehose)的數(shù)據(jù)被推送到消息系統(tǒng)箍铲,然后消息系統(tǒng)將這些數(shù)據(jù)傳輸?shù)?SPE 并由 SPE 處理這些數(shù)據(jù)(即字數(shù)統(tǒng)計)雇卷。最后,將數(shù)據(jù)處理結果存儲在字數(shù)統(tǒng)計數(shù)據(jù)庫中,也可以進一步用作分析关划。
《Apache Pulsar 中的 effectively-once》一文討論了 SPE(尤其是 Heron)如何實現(xiàn) effectively-once 保證膘融。但是,在上圖所示的字數(shù)統(tǒng)計應用程序中祭玉,消息系統(tǒng)和數(shù)據(jù)源(將數(shù)據(jù)推送到消息系統(tǒng)時)都可能發(fā)生故障氧映。
https://www.splunk.com/en_us/blog/it/effectively-once-semantics-in-apache-pulsar.html
要想確保數(shù)據(jù)管道內(nèi)實現(xiàn) effectively-once 保證,需要為消息系統(tǒng)和數(shù)據(jù)源提供 effectively-once 保證脱货。字數(shù)統(tǒng)計數(shù)據(jù)庫也可能會發(fā)生故障岛都,從而使問題變得更加復雜。但是振峻,該數(shù)據(jù)庫只用于存儲字數(shù)統(tǒng)計節(jié)點的數(shù)據(jù)副本臼疫。因此,即使數(shù)據(jù)庫發(fā)生故障扣孟,用戶也可以很容易地恢復數(shù)據(jù)庫烫堤。關于這一點本文將不再贅述。
當消息系統(tǒng)或 SPE 中發(fā)生故障后凤价,為了提供 effectively-once 保證鸽斟,需要指定故障發(fā)生前的一個數(shù)據(jù)時間點,SPE 可以重新連接到這一時間點的消息系統(tǒng)讀取數(shù)據(jù)利诺。重新連接時富蓄,SPE 需要接收發(fā)生故障前收到的所有信息。不應該發(fā)生消息丟失或消息重復故障慢逾。對于絕大多數(shù)用戶來說立倍,消息順序也應該相同。
盡管“順序相同”這一要求本身并非正確性要求侣滩,但可以考慮一下消息順序不同的情況口注。為了確保不重復消息,消息接收方(即 SPE)必須追蹤所有已接收處理的消息君珠。追蹤時間越長寝志,存儲需求越大。因此 SPE 不適用于長時間運行的系統(tǒng)葛躏。所以澈段,消息順序相同雖然不是一項必須的要求,但的確可以為系統(tǒng)運行帶來便利舰攒。
沒有丟失或重復消息,并且消息順序相同悔醋。這就實現(xiàn)了全序原子廣播(TOAB)摩窃,也就是分布式系統(tǒng)中常提到的共識。
https://en.wikipedia.org/wiki/Consensus_(computer_science)
消息系統(tǒng)想要實現(xiàn) effectively-once 保證,就必須實現(xiàn)共識或者借助其他外在系統(tǒng)幫助其實現(xiàn)共識猾愿。
開源社區(qū)提供許多實現(xiàn)共識的常見系統(tǒng)(https://www.consul.io/)鹦聪。但是,這些系統(tǒng)一般使用鍵值( K-V)類型的接口蒂秘,并不適合存儲消息流泽本。而且,鍵值類型的接口會將數(shù)據(jù)存儲在集群的單一日志副本上姻僧。也就是說规丽,當為消息系統(tǒng)向外(橫向)擴展多個流時,這些接口的運行就會出現(xiàn)很嚴重的問題撇贺。因此赌莺,對用戶最友好的系統(tǒng)應該既能提供類似日志的接口,又能向外擴展多個流松嘶。
只有極少數(shù)系統(tǒng)可以同時提供上述兩種功能艘狭,而 Apache BookKeeper 便是其中之一。BookKeeper 可以實現(xiàn) ZooKeeper 要求的一致性翠订,并對其進行水平擴展巢音,因此可以存儲日志副本。
關于 BookKeeper 如何保證全序原子廣播的可擴展性尽超,可以參考文章:
https://www.splunk.com/en_us/blog/it/scaling-out-total-order-atomic-broadcast-with-apache-bookkeeper.html
Apache Pulsar 使用 BookKeeper 存儲與每個 topic 關聯(lián)的消息流港谊,因此可以實現(xiàn) effectively-once 保證。BookKeeper 可以為 Pulsar 提供全序原子廣播保證橙弱,因此客戶端可以重連過去任一時間點歧寺。Pulsar 通過游標實現(xiàn)這一連接。
Pulsar 利用發(fā)布消息的應用程序?qū)?shù)據(jù)推送給消息系統(tǒng)棘脐,因此需要實現(xiàn)數(shù)據(jù)的 effiectively-once 保證斜筐。Pulsar 通過消息去重機制實現(xiàn)了消息 effiectively-once 保證。
更多詳細信息蛀缝,可以參考文章《Apache Pulsar 中的 effectively-once》顷链。
https://www.splunk.com/en_us/blog/it/effectively-once-semantics-in-apache-pulsar.html