Pulsar基本概念


學習pulsar有一段時間了,對其基本概念和工作原理也比較了解了,也搭建過幾次集群並添加了prometheus監控,這兩天有時間把pulsar的基礎知識以問題的形式的整理了一下,以加深自己的理解,也便於以后查閱。

1.pulsar優勢

高吞吐,低延遲,多租戶,計算存儲分離,跨機房復制,分層存儲等;

所謂 下一代雲原生消息平台。

2.一個消息包含哪些內容

數據、key、屬性、生產者名稱、序列ID、發布時間等,其中數據是必須項;

默認的消息最大值是 5 MB,可通過配置文件修改。

3.支持消息類型

普通消息、壓縮消息、批量消息、分塊消息、延遲消息、順序消息、廣播消息、重試隊列、死信隊列、事務消息。

4.生產和消費

1)客戶端

生產者和消費者都是一個進程,發送和消費消息即為和broker進程間交互;

2)生產者

兩種發送模式:

同步發送-生產者在發送消息后等待broker確認,否則認為發送失敗,可設置超時時間;

異步發送-生產者將消息放到阻塞隊列里,並立即返回,在后台將消息發送給broker,如果隊列已滿,則根據客戶端參數阻塞或返回失敗;

三種訪問模式:

Shared共享-一個topic可以同時有多個生產者,默認模式;

Exclusive獨占-一個topic同時只能有一個生產者,返回錯誤;

WaitForExclusive等待獨享-如果一個topic已經連接了生產者,那么新的生產者創建將掛起(而不是超時),直到該生產者獲得Exclusive訪問權,領導者選舉;

3)消費者

Consumer 端有一個隊列,用於接收從 broker 推送來的消息,隊列的默認長度是1000,可通過參數配置,每當 consumer.receive() 被調用一次,就從緩沖區(buffer)獲取一條消息。

兩種接收模式:

同步接收-在收到消息之前都是被阻塞的,常用模式;

異步接收-立即返回一個 future 值,一旦收到新的消息就立刻完成;

兩種確認模式:

單條確認-每一條消息都需要返回確認,常用模式;

累計確認-消費者只需要確認最后一條收到的消息,所有之前(包含此條)的消息,都不會被再次重發給該消費者;

取消確認:

當消費者在某個時間沒有成功的消費某條消息,消費者想重新消費到這條消息,這個消費者可以發送一條取消確認消息到 broker,broker 會將這條消息重新發給消費者;

注意取消確認可能會打亂原有的消息順序,批量消息會一起重發;

確認超時:

如果消息沒有被成功消費,可以通過設置確認超時時間,讓 broker 自動重新交付這個消息,客戶端會跟蹤超時時間范圍內所有未確認的消息,並且在指定超時時間后會發送一個 重發未確認的消息 請求到 broker;

注意取消確認是以更高的精度在控制單條消息的重新傳遞,批量消息會一起重發。

重試主題:

很多在線的業務系統,由於業務邏輯處理出現異常,消息一般需要被重新消費。 若需要允許延時重新消費失敗的消息,你可以配置生產者同時發送消息到業務主題和重試主題,並允許消費者自動重試消費。 配置了允許消費者自動重試,如果消息沒有被消費成功,它將被保存到重試主題當中,並在指定延時時間后,自動重新消費重試主題里面的消費失敗消息;

需要消費者開啟重試;

死信主題:

在消費者無法成功消費某些消息時,消費失敗的消息存儲在一個單獨的主題中,稱為死信主題,您可以決定如何處理死信主題中的消息;

一般是在重試一定次數后放到死信主題中,即,取消確認/確認超時--消息重試--死信主題;

需要消費者開啟死信主題並指定重試次數。

5.tenant,namespace和topic

租戶是 topic 的最基本單位,可以跨集群分布,每個租戶可以有單獨的授權機制和集群配置,它不屬於某個集群,而是能夠訪問某個或某些集群,和集群是access to的關系;

命名空間是租戶內部邏輯上的命名術語,指租戶的管理單元,命名空間上設置的配置策略適用於在該命名空間中創建的所有 topic;

Pulsar 通過租戶和命名空間這兩個關鍵概念支持多租戶;

主題名稱是具有明確定義結構的 URL:

{persistent|non-persistent}://tenant/namespace/topic

默認是持久化的,所有的消息都會被持久化的保存到磁盤當中,租戶可以跨越實例中的多個集群,命名空間是管理topic的基本單元;

非持久topic的消息不會被保存在硬盤上,只存活於內存中broker會立即發布消息給所有連接的訂閱者,使得非持久topic的消息比持久topic稍微變快,有更低的發布延遲;當使用非持久topic分發時,殺掉Pulsar的broker或者關閉訂閱者,此topic上所有的瞬時消息都會丟失,意味着客戶端可能會遇到消息缺失。

6.訂閱

訂閱是命名好的配置規則,指導消息如何投遞給消費者;

四種訂閱模式:

Exclusive獨占-只有一個消費者可以綁定到訂閱上,否則報錯,默認模式;

Failover災備-多個消費者可以綁定到同一個訂閱上,主消費者消費消息,主斷開后,下一個消費者接着消費;

Shared共享-多個消費者可以綁定到同一個訂閱上,消息通過輪詢機制分發給不同的消費者,並且每個消息僅會被分發給一個消費者,消息順序不被保證;

Key_Shared key共享-多個消費者可以綁定到同一個訂閱上,消息跨消費者分布式傳遞,具有相同鍵或相同排序鍵的消息僅傳遞給一個消費者,無論消息被重新傳遞多少次,它都會傳遞給同一個消費者,需要為消息指定鍵或排序鍵;

  

注意-訂閱都是對於同一個topic來說的,不同topic之間互不影響;如果一個訂閱沒有消費者,則訂閱模式是未定義的;一個消費者可以同時訂閱多個topic,但順序則不被保證。

7.分區topic

分區topic一種特殊類型的topic,可以被多個broker處理,允許更高的吞吐量,實際是通過在底層擁有 N 個內部主題來實現的,這個 N 的數量就是等於分區的數量,當向分區topic發送消息時,每條消息被路由到其中一個broker上,對應其中一個分區Pulsar自動處理跨broker的分區分布,一個broker可能有多個分區;

路由模式確定每條消息該發往哪個分區,而訂閱模式確定消息傳遞給哪個消費者;

三種路由模式:

RoundRobinPartition-生產者以輪詢的方式將消息發布到所有分區,批量消息作為整體處理,如果消息指定了key,則根據key的hash值分配到對應分區,默認模式;

SinglePartition-生產者將會隨機選擇一個分區,並發布所有消息到這個分區,如果消息指定了key,則根據key的hash值分配到對應分區;

CustomPartition-使用自定義消息路由器實現來決定特定消息的分區;

可以通過指定路由模式以及消息是否有key來保證消息的順序。

8.消息保留和過期

默認策略:

立即刪除所有已經被消費者確認過的的消息;

backlog的形式,持久保存所有未被確認的消息;

兩個特性:

消息保留讓你可以保存consumer確認過的消息;

消息過期讓你可以給未被確認的消息設置存活時長(TTL);

  

說明:

所有消息保留和過期在namespace層面管理。

9.消息去重

當生產者再次發送同一個消息時,broker知道已經收到這個消息了,所以不會再持久化這個消息;保證一條消息只能在 Pulsar 服務端被持久化一次,能夠阻止不必要的消息重復,它保證了即使消息被消費了多次,也只會被保存一次;

可以在namespace或topic層設置。

10.消息延遲

允許消費者能夠過一段時間才能消費到這條消息,而不是消息發布后,就馬上可以消費到;

Broker 保存消息是不經過任何檢查的,當消費者消費一條消息時,如果這條消息是延時消息,那么這條消息會被加入到DelayedDeliveryTracker當中,訂閱檢查機制會從DelayedDeliveryTracker獲取到超時的消息,並交付給消費者。

11.客戶端

Pulsar提供了基於多種開發語言的客戶端API,創建過程如下:

客戶端會先和任意一個broker建立連接,發送一個http請求查詢topic所在broker,然后和該broker建立一個tcp連接並進行認證和鑒權,通過后,客戶端會為該broker創建一個生產者或消費者,tcp連接斷開時,客戶端會進行重連,直到成功或超時;

topic不存在時,如果開啟了自動創建,pulsar會自動創建該topic並將其分配給負載最少的broker,如果不允許自動創建則會報錯;如果認證和鑒權失敗也會報錯。

12.Reader接口

Pulsar中,標准的消費者接口包括訂閱topic、處理消息、ack確認;

對於新創建的訂閱,默認位於topic的末端,消費者從之后的第一條消息開始讀取,對於已經存在的訂閱,消費者將從該訂閱內最早的未確認消息開始讀取,總之,消費者接口是基於消息確認機制來自動管理訂閱游標位置;

Pulsar 的 reader 接口允許應用程序手動管理游標,當您使用 reader(而不是消費者)連接 topic 時,需要指定 reader 在連接到該 topic 時從哪條消息開始消費,reader 接口支持的開始位置包括:

1) Topic 中最早的可用消息earliest;

2) Topic 中最新的可用消息latest;

3) 如果你想開始的位置在最早和最新之間, 則需要顯示的指定消息ID MessageId;

注意,reader本質上是非持久的,並且不會阻止topic中的數據被刪除,因此強烈建議配置數據保留策略,如果topic沒有配置足夠長的消息保留時間,就會出現消息還沒有被讀取就被刪除的情況。

 

參考 pulsar官方文檔 http://pulsar.apache.org/docs/zh-CN/next/concepts-messaging/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM