Apache Pulsar是一款由雅虎開發的類似於Kafka的企業級消息訂閱系統,在2016將其開源,由Apach基金會孵化,現在已經成長為Apache基金會的頂級項目。Pulsar在雅虎內部已經運行了三年,服務於眾多的應用,主要有雅虎郵箱、雅虎財務系統、雅虎運動、Flickr、Gemini廣告平台以及雅虎分布式鍵值對存儲系統Sherpa等。
Pulsar相關概念。
為Pulsar提供數據的應用叫做生產者,而從Pulsar消費數據的應用被稱為消費者,有時也稱為訂閱者。主題Topic是Pulsar的核心資源,這個和Kafka有點類似。主題Topic就像一個管道,生產者往里面寫數據,而消費者消費里面的數據。這是Pulsar的特性1,如下圖所示:
Pulsar一開始創建時就支持多租戶的使用場景。為了支持多租用的功能,Pulsar包含兩種資源,分別是“properties”和“namespaces”。property(資產)代表系統中的租戶。舉個例子,假設部署一個Pulsar集群支持各種各樣的應用(就像Pulsar在雅虎公司一樣),在Pulsar集群中,每一個資產代表企業中的一個團隊,一個核心功能或者一條產品線。每個屬性依次包含若干個namespace,例如一個namespace對應每個應用或者使用場景。一個namespace可以包含任意多個主題topic。總的來說,一個Pulsar集群包含多個資產property,一個資產property包含多個namespace,一個namespace包含多個主題topic。Pulsar集群、Property資產、Namespace和主題topic的關系圖如下圖所示:
namespace是Pulsar中最基本的管理單元,在namespace這一層面,可以設置權限,調整副本設置,管理跨集群的消息復制,控制消息策略和執行關鍵操作。一個主題topic可以繼承其所對應的namespace的屬性,因此我們只需對namespace的屬性進行設置,就可以一次性設置該namespace中所有主題topic的屬性。
namespace有兩種,分別是本地的namespace和全局的namespace:
- 本地namespace——僅對定義它的集群可見。
- 全局namespace——跨集群可見,可以是同一個數據中心的集群,也可以是跨地域中心的集群,這依賴於是否在namespace中設置了跨集群拷貝數據的功能。
雖然本地namespace和全局namespace的作用域不同,但是只要對他們進行適當的設置,都可以跨團隊和跨組織共享。一旦生產者獲得了namespace的寫入權限,那么它就可以往namespace中的所有topic主題寫入數據,如果某個主題不存在,則在生產者第一次寫入數據時動態創建。
之前提到過,每個namespace會一個或多個主題topic,每個主題會被多個消費者訂閱,每個訂閱者會從其所訂閱的主題topic發布的所有消息中檢索和接收數據。為了給每個應用增加更多的靈活性,Pulsar支持三種不同的類型的訂閱,並且它們可以在同一個主題topic中共存:
- 獨享型訂閱(Exclusive subscription)——這種類型的訂閱在任何時候都只能有一個消費者。
- 共享型訂閱(Share subscription)——多個消費者消費同一個主題topic的數據,每個消費者會接收到一小部分數據。
- 失效型訂閱(Failover subscription)——多個消費者連接到一個主題topic,但是只有一個消費者能接收數據,其他消費者只有在當前消費者失效之后才會開始接收數據。
Pulsar提供三種不同類型的訂閱subscriptions。subscription提供一個最重要的功能就是解耦消息的生產和消費。通過支持不同類型的subscription,無需增加開發的復雜度就可以增強應用的彈性。下圖展現了三種不同類型的訂閱:
數據分區
topic主題中的數據有時會很小,小到幾KB,有時會很大,大道幾十TB。這意這意味着主題topic需要具備在某些情況下保持穩定的低吞吐量,在另一些情況下保持非常高的吞吐量的能力,這取決於使用者的數量。因此,當一個主題需要高吞吐率而例外一個主題需要低吞吐率時,會發生什么呢?為了解決該問題Pulsar允許你當將一個主題topic中的數據分成不同的區域然后存儲在不同的機器中。這就是Pulsar的分區功能。
對於處理跨多個節點的大量數據,使用分區是一個非常普通的做法,同時還可以實現高吞吐率。默認情況下,創建的主題topic是沒有分區的,但是創建有分區的主題topic也很容易,使用簡單的CLI命令或者通過調用API,並且指定分區數量即可。
當你創建有分區的主題時,Pulsar自動將數據分區,確保消費者和生產者與分區無關。對一個還沒分區但是已經寫入數據的主題進行分區之后,無需對原來的代碼進行修改,即可繼續將數據寫入該主題topic。也就是說分區和應用無關
Pulsar使用一個叫做broker的進程來處理主題的分區,Pulsar集群中的每個節點都運行一個自己的broker進程,下圖顯示了broker節點如何如果處理分區的細節。
應用程序無需修改代碼即可使用分區的優點,Pulsar還額外提供了一些hooks讓數據在不同分區和不同消費者之間的分布能達到最佳的效果。Pulsar提供四種不同的路由策略,根據你選擇的路由策略決定數據是如何路由到指定的分區。四種分區策略如下:
- Single partitioning(單一分區):生產者隨機獲取一個分區,並將數據寫入到該分區。該模式和無分區主題提供一樣的保證,但是對多個生產者寫入數據到主題topic的場景非常有用。
- Round robin partitioning(輪詢調度分區):在該應用場景,生產者將數據均勻的分布到所有的分區,第一條消息寫入到第一個分區,第二條消息寫入到第二個分區,以此類推。
- Hash partitioning(哈希分區):在該應用場景下是如何選擇分區接入數據的呢?每條消息都有一個key,然后對key調用哈希函數生成一個哈希值,根據該值來選擇消息要寫入的分區。哈希分區保證消息的按照key的順序分布。
- Custom partitioning(自定義分區):生產者使用自定義的函數接收消息並生成分區號,下次直接寫入對應的分區中,自定義分區模式保證應用程序完全控制分區邏輯。
數據持久性
一旦Pulsar broker接收並確認數據是來自生成者寫入到主題topic中的,它需要保證數據在任何情況下都不丟失,不像其他的消息管理系統,Pulsar使用Apache BookKeeper提供的低延遲持久化存儲特性保證數據的持久性。一旦Pulsar接收到數據,它會數據發送到多個BookKeeper節點,接收到數據的BookKeeper節點會數據寫入到內存和預寫日志(write-ahead log)中。在對數據確認之前會強制將日志寫入到持久化存儲設備中。通過將數據寫入到存儲設備中,即使出現斷電的情況,數據也不會丟失。只有當數據寫入到大多數的BookKeeper節點中,Pulsar才會發送確認消息給生產者。
零數據丟失和滿足性能要求是消息管理系統的最基本的兩個功能,這兩個功能在雅虎公司內部已經得到了驗證,自從2015年正式在生產環境中使用以來,Pulsar服務了雅虎公司多個重要的系統,例如雅虎財經、雅虎運動、雅虎郵箱、Gemini廣告平台以及雅虎分布式存儲服務平台Sherpa,目前Pulsar已經在雅虎公司大規模的使用:
- 部署在全球10大數據中心,具有全網復制能力。
- 每天處理超過100億的數據發布。
- 服務超過140萬個主題。
- 發布延遲時間的平均值低於5毫秒。
本文只是簡單介紹了Pulsar一些簡單的特性,以后將會寫一些文章介紹如何搭建Pulsar集群及其用法。
關注本人的公眾號獲取更多關於大數據和機器學習方面的知識