1. 程式人生 > >簡介Apache Pulsar-下一代分散式訊息系統

簡介Apache Pulsar-下一代分散式訊息系統

Matteo Merli & Karthik Ramasamy 譯 薛命燈

原文連結

Apache Pulsar(孵化器專案)是一個企業級的釋出訂閱(pub-sub)訊息系統,最初由Yahoo開發,並於2016年底開源,現在是Apache軟體基金會的一個孵化器專案。Pulsar在Yahoo的生產環境運行了三年多,助力Yahoo的主要應用,如Yahoo Mail、Yahoo Finance、Yahoo Sports、Flickr、Gemini廣告平臺和Yahoo分散式鍵值儲存系統Sherpa。

概念與術語

向Pulsar傳送資料的應用程式叫作生產者(producer),而從Pulsar讀取資料的應用程式叫作消費者(consumer)。有時候消費者也被叫作訂閱者。主題(topic)是Pulsar的核心資源,一個主題可以被看成是一個通道,消費者向這個通道傳送資料,消費者從這個通道拉取資料。
生產者、消費者和主題

圖1:生產者、消費者和主題

構建Pulsar的目的是為了支援多租戶(multi-tenant)應用場景。Pulsar的多租戶機制包含了兩種資源:資產(property)和名稱空間(namespace)。資產代表系統裡的租戶。假設有一個Pulsar叢集用於支援多個應用程式(就像Yahoo那樣),叢集裡的每個資產可以代表一個組織的團隊、一個核心的功能或一個產品線。一個資產可以包含多個名稱空間,一個名稱空間可以包含任意個主題。

Pulsar各個元件間的關係

圖2:Pulsar各個元件間的關係

名稱空間是Pulsar最基本的管理單元。在名稱空間層面,我們可以設定許可權、調整複製選項、管理跨叢集的資料複製、控制訊息的過期時間或執行其他關鍵任務。名稱空間裡的主題會繼承名稱空間的配置,所以我們可以一次性對同一個名稱空間內的所有主題進行配置。名稱空間可以分為兩種:

  • 本地(local)——本地名稱空間只在叢集內可見。

  • 全域性(global)——名稱空間對多個叢集可見,可以是同一個資料中心內的叢集,也可以是跨地域資料中心的叢集。該功能取決於是否啟用了叢集複製功能。

雖然本地名稱空間和全域性名稱空間的作用域不同,但它們都可以在不同的團隊或不同的組織內共享。如果應用程式獲得了名稱空間的寫入許可權,就可以往該名稱空間內的所有主題寫入資料。如果寫入的主題不存在,就會建立該主題。

每個名稱空間可以包含一到多個主題,每個主題可以有多個訂閱者,每個訂閱者可以接收所有釋出到該主題的訊息。為了給應用程式提供更大的靈活性,Pulsar提供了三種訂閱型別,它們可以共存在同一個主題上:

  • 獨享(exclusive)訂閱——同時只能有一個消費者。

  • 共享(shared)訂閱——可以由多個消費者訂閱,每個消費者接收其中的一部分訊息。

  • 失效備援(failover)訂閱——允許多個消費者連線到同一個主題上,但只有一個消費者能夠接收訊息。只有在當前消費者發生失效時,其他消費者才開始接收訊息。

圖3展示了這三種類型的訂閱。Pulsar的訂閱機制解耦了訊息的生產者和消費者,在不增加複雜性和開發工作量的情況下為應用程式提供了更大的彈性。

不同型別的Pulsar訂閱

圖3:不同型別的Pulsar訂閱

資料分割槽

寫入主題的資料可能只有幾個MB,也有可能是幾個TB。所以,在某些情況下主題的吞吐量很低,有時候又很高,完全取決於消費者的數量。那麼碰到有些主題吞吐量很高而有些又很低的情況該怎麼處理?為了解決這個問題,Pulsar將一個主題的資料分佈到多臺機器上,也就是所謂的分割槽。

在處理海量資料時,為了保證高吞吐量,分割槽是一種很常見的手段。預設情況下,Pulsar的主題是不進行分割槽的,但通過命令列工具或API可以很容易地建立分割槽主題,並指定分割槽的數量。

在建立好分割槽主題之後,Pulsar可以自動對資料進行分割槽,不會影響到生產者和消費者。也就是說,一個應用程式向一個主題寫入資料,對主題分割槽之後,不需要修改應用程式的程式碼。分割槽只是一個運維操作,應用程式不需要關心分割槽是如何進行的。

主題的分割槽操作由一個叫作broker的程序來處理,Pulsar叢集裡的每個節點都會執行自己的broker。

將一個主題分到多個broker上

圖4:將一個主題分到多個broker上

主題分割槽不會影響到應用程式,除此之外,Pulsar還提供了幾種訊息路由策略,幫助我們更好地跨分割槽、跨消費者分佈資料。

  • 單個分割槽——生產者隨機挑選一個分割槽,並將資料寫入該分割槽。該策略與非分割槽主題提供的保證是一樣的,不過如果有多個生產者向同一個主題寫入資料,該策略就會很有用。

  • 輪詢(round robin)分割槽——生產者通過輪詢的方式將資料平均地分佈到各個分割槽上。比如,第一個訊息寫入第一個分割槽,第二個訊息寫入第二個分割槽,並以此類推。

  • 雜湊(hash)分割槽——每個訊息會帶上一個鍵,要寫入哪個分割槽取決於它所帶的鍵。這種分割槽方式可以保證次序。

  • 自定義分割槽——生產者使用自定義函式生成分割槽對應的數值,然後根據這個數值將訊息寫入對應的分割槽。

永續性

Pulsar broker在收到訊息並進行確認之後,就必須確保訊息在任何情況下都不會丟失。與其他訊息系統不同的是,Pulsar使用Apache BookKeeper來保證永續性。BookKeeper提供了低延遲的持久化儲存。Pulsar在收到訊息之後,將訊息傳送給多個BookKeeper節點(具體由複製係數來定),節點將資料寫入預寫式日誌(write ahead log),同時在記憶體裡也儲存一份。節點在對訊息進行確認之前,強制將日誌寫入到持久化的儲存上,因此即使出現電力故障,資料也不會丟失。因為Pulsar broker將資料發給了多個節點,所以只會在大多數節點(quorum)確認寫入成功之後它才會將確認訊息發給生產者。Pulsar就是通過這種方式來保證即使在出現了硬體故障、網路故障或其他故障的情況下仍然能夠保證資料不丟失。在後續的文章中,我們將深入探討這方面的細節。

生產環境實踐

Pulsar目前在助力Yahoo的主要應用,如Yahoo Mail、Yahoo Finance、Yahoo Sports、Gemini廣告平臺和Yahoo分散式鍵值儲存系統Sherpa。很多場景都要求很強的永續性保證,比如零資料丟失,同時又要求很高的效能。Pulsar從2015年開始部署到生產環境,現在在Yahoo的生產環境裡大規模地執行。

  • Pulsar被部署在10多個數據中心裡,具備了全網格複製能力

  • 每天處理超過1000億個訊息

  • 支援著140萬個主題

  • 整體的訊息釋出延遲小於5毫秒

總結

在這篇文章裡,我們簡單介紹了Apache Pulsar的一些概念,並解釋了Pulsar是如何通過在傳送確認訊息前提交資料來保證永續性的,以及通過分割槽來提高吞吐量,等等。在後續的文章中,我們將深入探討Pulsar的整體架構和特性細節,我們也將提供一些指南教大家如何更好地使用Pulsar。

檢視英文原文:
Introduction to the Apache Pulsar pub-sub messaging platform:
https://streaml.io/blog/intro-to-pulsar/