發佈訂閱消息系統Apache Pulsar簡介

本文由 【 AI前線】原創,原文連接: t.cn/RTzihsu


AI 前線導讀:Apache Pulsar(孵化器項目)是一個企業級的發佈訂閱(pub-sub)消息系統,最初由 Yahoo 開發,並於 2016 年末開源,如今是 Apache 軟件基金會的一個孵化器項目。Pulsar 在 Yahoo 的生產環境運行了三年多,助力 Yahoo 的主要應用,如 Yahoo Mail、Yahoo Finance、Yahoo Sports、Flickr、Gemini 廣告平臺和 Yahoo 分佈式鍵值存儲系統 Sherpa。微信


Pulsar 相關概念和術語網絡

向 Pulsar 發送數據的應用程序叫做生產者(producer),而從 Pulsar 讀取數據的應用程序叫做消費者(consumer)。有時候消費者也被叫做訂閱者。主題(topic)是 Pulsar 的核心資源,一個主題能夠被當作是一個通道,消費者向這個通道發送數據,消費者從這個通道拉取數據。架構

運維

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

構建 Pulsar 的目的是爲了支持多租戶(multi-tenant)應用場景。Pulsar 的多租戶機制包含了兩種資源:資產(property)和命名空間(namespace)。資產表明系統裏的租戶。假設有一個 Pulsar 集羣用於支持多個應用程序(就像 Yahoo 那樣),集羣裏的每一個資產能夠表明一個組織的團隊、一個核心的功能或一個產品線。一個資產能夠包含多個命名空間,一個命名空間能夠包含任意個主題。函數

                                          圖 2:Pulsar 各個組件間的關係工具

命名空間是 Pulsar 最基本的管理單元。在命名空間層面,咱們能夠設置權限、調整複製選項、管理跨集羣的數據複製、控制消息的過時時間或執行其餘關鍵任務。命名空間裏的主題會繼承命名空間的配置,因此咱們能夠一次性對同一個命名空間內的全部主題進行配置。命名空間能夠分爲兩種:性能

  • 本地(local)——本地命名空間只在集羣內可見。spa

  • 全局(global)——命名空間對多個集羣可見,能夠是同一個數據中心內的集羣,也能夠是跨地域數據中心的集羣。該功能取決因而否啓用了集羣複製功能。命令行

雖然本地命名空間和全局命名空間的做用域不一樣,但它們均可以在不一樣的團隊或不一樣的組織內共享。若是應用程序得到了命名空間的寫入權限,就能夠往該命名空間內的全部主題寫入數據。若是寫入的主題不存在,就會建立該主題。

每一個命名空間能夠包含一到多個主題,每一個主題能夠有多個訂閱者,每一個訂閱者能夠接收全部發布到該主題的消息。爲了給應用程序提供更大的靈活性,Pulsar 提供了三種訂閱類型,它們能夠共存在同一個主題上:

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

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

  • 失效備援(failover)訂閱——容許多個消費者鏈接到同一個主題上,但只有一個消費者可以接收消息。只有在當前消費者發生失效時,其餘消費者纔開始接收消息。

圖 3 展現了這三種類型的訂閱。Pulsar 的訂閱機制解耦了消息的生產者和消費者,在不增長複雜性和開發工做量的狀況下爲應用程序提供了更大的彈性。

                                             圖 3:不一樣類型的 Pulsar 訂閱

數據分區

寫入主題的數據可能只有幾個 MB,也有多是幾個 TB。因此,在某些狀況下主題的吞吐量很低,有時候又很高,徹底取決於消費者的數量。那麼碰到有些主題吞吐量很高而有些又很低的狀況該怎麼處理?爲了解決這個問題,Pulsar 將一個主題的數據分佈到多臺機器上,也就是所謂的分區。

在處理海量數據時,爲了保證高吞吐量,分區是一種很常見的手段。默認狀況下,Pulsar 的主題是不進行分區的,但經過命令行工具或 API 能夠很容易地建立分區主題,並指定分區的數量。

在建立好分區主題以後,Pulsar 能夠自動對數據進行分區,不會影響到生產者和消費者。也就是說,一個應用程序向一個主題寫入數據,對主題分區以後,不須要修改應用程序的代碼。分區只是一個運維操做,應用程序不須要關心分區是如何進行的。

主題的分區操做由一個叫做 broker 的進程來處理,Pulsar 集羣裏的每一個節點都會運行本身的 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。

查看英文原文:streaml.io/blog/intro-…

關注咱們的微信號"AI前線",後臺回覆「AI」可得到《AI前線》系列PDF電子書