Pulsar 介紹

前言

本文將介紹 pulsar 的核心功能,不會對設計細節(jié)以及與其他 MQ 進行對比

概述

Apache Pulsar 是一個多租戶、高性能的發(fā)布-訂閱消息中間件, Pulsar 最初由雅虎開發(fā)。從 2018 年 9 月以來,它是 Apache 基金會的頂級項目之一,由 Apache 軟件基金會管理。更多歷史背景參考 。截止當前發(fā)文, 項目倉庫 已有 9.7k 個 star 和 451 位 contributions,目前最新版本為 2.8.1

和大多數(shù)消息中間件一樣,Pulsar 也是建立在發(fā)布訂閱模式上。在這種模式中,producer 向 broker 中的 topic 發(fā)送 message。consumer 訂閱這些 topic 并處理傳入的消息。不同之處在于 pulsar 中的 broker 不會物理存儲 message,而是交給 apache bookkeeper 單獨處理,broker 只是充當一個消息路由尋址的功能

架構(gòu)

從宏觀角度來看,多個 Broker 節(jié)點組成一個 Pulsar Cluster;多個 Pulsar Cluster 組成一個 Pulsar Instance,Pulsar 通過 geo-replication 支持 Pulsar Instance 內(nèi)在不同的集群發(fā)送和消費消息。在 pulsar 集群中:

  • 每個 Broker 節(jié)點處理和負載均衡來自 Producer 發(fā)送的 Message ,將 Message 分派給消費者,與 Pulsar 配置存儲 Zookeeper 通信以處理各種協(xié)調(diào)任務,將消息存儲在 BookKeeper 實例(又名 bookies)中,依賴特定于集群的 ZooKeeper 集群任務等
  • BookKeeper 集群處理 Message 的持久存儲
  • ZooKeeper 集群處理 Pulsar 集群之間的協(xié)調(diào)任務(localZK 負責 cluster 內(nèi)部配置,Global ZK 負責 Cluster 之間的配置)
  • Global replication 負責集群間的數(shù)據(jù)復制
Getting Started

核心概念

Broker

Pulsar 中的 broker 是一個無狀態(tài)的組件,主要負責兩部分:

  1. 一個提供 REST 接口的 HTTP 服務器 ,為 Producter 和 Consumer 提供了 tencent、namespace、topic 、subscription 管理和 topic 尋址的功能。Producter 連接到 Broker 發(fā)布消息, Consumer 連接到 Broker 來消費消息
  2. 一個基于 TCP 協(xié)議的異步協(xié)調(diào)器,用于所有的數(shù)據(jù)傳輸

Producer

Producer 發(fā)送 Message 到 Topic 時,除了支持 sync、async 的發(fā)送方式之外,在與 Topic 連接上, 還增加了 Excusive、Share、WaitForExclusive 三種語義:

Access mode Description
Share 共享模式,所有 producer 可同時使用同一個 topic(默認策略)
Excusive 獨占模式,只會有一個 producer 向生產(chǎn)者發(fā)送消息,確保當有一個 producer 與 topic 建立好連接之后,其他 producer 發(fā)送消息時將報錯
WaitForExclusive 主備模式,與 topic 連接成功的 producer 將成為 leader producer,其他 producer 連接時將會阻塞等待(不會超時),直到 leader producer 斷開連接

Consumer

Consumer 通過 subscription 來連接到 Topic,每次通過發(fā)送 flow permit request 給 Broker 來獲取 Message,同時將 Message 放入本地維護的一個 buffer queue (默認大小為 1000)隊列來緩沖,每次 consumer.receive() 調(diào)用時,將從 buffer queue 獲取消息

類似的, consumer 也支持兩個接收消息的方式:sync、async

Receive Mode Description
Sync receive 阻塞等待,直到有 Message 可用
Async receive 返回一個 future , 將 Message 是否可用通過 future 中的狀態(tài)來維護

Topic

Topic 在 pulsar 中被當做是一個渠道來傳輸 Producer 和 Conusmer 之間的消息。一個完整的 Topic 結(jié)構(gòu)為:{persistent|non-persistent}//tenant/namespace/topic
由 4 部分構(gòu)成:

component desc
1 {persistent|non-persistent} pulsar 支持持久化、和非持久化的 Topic,persistent、non-persistent 分別對應這兩種;對于持久化 Topic 來講,所有的消息都會被持久化到磁盤中,如果是 cluster 集群則會持久化到多個 pulsar 實例的磁盤中,如果是非持久話的 Topic,則只會將消息保存到內(nèi)存中,而不會持久化到磁盤
2 tenant 租戶,Topic 中最上層的管理者,屬于 puslar 實例層級
3 namespace 命名空間,Topic 最小的管理單元,大多數(shù) Topic 的配置管理都跟 namespace 有關,每個租戶 tenant 都擁有至少一個 namespace
4 topic topic 即與其他消息中間件類似的 topic name,在 pulsar 中沒有實際的意義

Subscription

每條消息在消息的日志上都有一個偏移量 (offset),Pulsar 使用 Subscrtion 來跟蹤這個偏移量(offset),通過 Subscrtion 可以控制 Consumer 消費消息的方式,在 pulsar 中提供了四種消費方式: exclusive 、shared、 failover, and key_shared.

subscription

Exclusive

即獨占模式,在獨占模式下,只允許一個 consumer 連接到 Subscription 上。如果多個 consumer 使用同一個 Subscription 訂閱一個 Topic ,則會發(fā)生錯誤

Shared

共享模式,允許多個 consumer 使用同一個 Subscription 訂閱 Topic,Message 將會循環(huán)的發(fā)給多個 Consumer,

Failover

key_shared

按 key 共享,與 Shared 模式相同,允許使用同一個 Subscription 訂閱 Topic,不同的是 Message 在 Consumer 的消費中,具有相同 key 或 orderingKey 的 Message 只傳遞給同一個 Consumer。無論消息被重新傳遞多少次,它都會傳遞給同一個消費者(必須指定 orderingKey 或 key)

Partitioned topics

普通的 Topic 僅由一個 Broker 處理,但單個 Broker 處理瓶頸將限制 Topic 的最大吞吐量,Partitioned Topic 分區(qū)主題通過多 Broker 并發(fā)處理來提高了 Topic 的吞吐量.

分區(qū)主題實際上在 pulsar 中是由多個內(nèi)部主題構(gòu)成,每個主題歸屬于某一個 Broker 上,message 和對應 broker 上的內(nèi)部主題路由由 pulsar 來維護

image

Topic1 主題有五個分區(qū)(P0 到 P4),分布在三個 Broker 上。因為分區(qū)比 Broker 多,兩個 Broker 一個處理兩個分區(qū),而第三個只處理一個(同樣,Pulsar 會自動處理這種分區(qū)的分布)

通常將 producer 發(fā)送 message 到 parition topic 的消息路由方式和消費者通過 Subscription 訂閱 Topic 分開討論,分區(qū)消息路由方式?jīng)Q定了吞吐量的高低;而 consumer 通過 subscription 訂閱消費者則由應用程序業(yè)務來決定

分區(qū)主題和普通主題在 Subscription 一個 Topic 上沒有區(qū)別,,因為分區(qū)僅僅決定消息從生產(chǎn)者發(fā)布到消費者處理和 ACK 確認之間邏輯

Routing Mode

Mode Description
RoundRobinPatition 如果 Message 中沒有 key 屬性,那么 producer 將以循環(huán)方式跨所有分區(qū)發(fā)送消息,最終可以達到最大吞吐量,如果在 Message 上指定了 Key,則 producer 將 key hash 之后,將 Message 分配給特定分區(qū)。(默認處理方式)
SinglePartition 如果 Message 中沒有 key 屬性,那么 producer 將隨機選擇一個分區(qū)并將所有消息發(fā)布到該分區(qū)中,如果在 Message 上指定了 Key,則 producer 將 key hash 之后,將 Message 分配給特定分區(qū)。
CustomPartition 使用將被調(diào)用的自定義消息路由器實現(xiàn)來確定特定消息的分區(qū)

Ordering guarantee

消息的順序與消息路由模式和消息的 key 有關,通常需要保證具有相同 key 的消息在同一個 topic 中具有順序性。如果消息中帶有 key 屬性,那么這個消息在 RoundRobinPatition 和 SinglePartition 路由模式中將具有順序性

總結(jié)

通過對 Pulsar 組成的一些功能模塊進行簡單介紹來大致了解其是如何運轉(zhuǎn)的(producer->broker->consumer)、由那些組件構(gòu)成的(pulsar-instance、zookeeper、bookker),以及有哪些功能特性(route mode、subscription、partition ),后面將通過源碼層來深度對一些優(yōu)秀的設計進行剖析

參考

pulsar

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容