Pulsar 消息概念2

1 主題
主題名稱結構的URL:
{persistent|non-persistent}://tenant/namespace/topic

名稱組成 說明
persistent / non-persistent 持久和非持久
tenant 租戶
namespace 命名空間 主題的管理單元,用作相關主題的分組機制。大多數主題配置是在命名空間級別執行的。每個租戶可以有多個命名空間
topic 名字的最後一部分

無需顯式創建新主題
你不需要在Pulsar中顯式地創建主題。如果客戶端嘗試向尚未存在的主題寫入消息或接收消息,則Pulsar將自動在主題名稱中提供的命名空間下創建該主題

2 命名空間
名稱空間是租戶中的邏輯術語。租戶可以通過管理API創建多個名稱空間。例如,具有不同應用程序的租戶可以爲每個應用程序創建單獨的命名空間。命名空間允許應用程序創建和管理主題的層次結構。主題my tenant/app1是我的租戶的應用程序app1的命名空間。可以在命名空間下創建任意數量的主題

3 訂閱模式
Pulsar有三種訂閱模式:獨佔(exclusive),共享(shared),故障轉移(failover)
獨佔模式是默認訂閱模式
共享模式的侷限性
使用共享模式時有兩件重要的事情需要注意:
無法保證消息排序。
不能將累積確認與共享模式一起使用。
4 密鑰共享(Key_shared)
在密鑰共享模式下,多個消息者可以同一訂閱
密鑰共享模式的限制
在使用密鑰共享模式時,有兩件重要的事情需要注意:
您需要爲消息指定密鑰或orderingKey
不能將累積確認與密鑰共享模式一起使用
密鑰共享訂閱是一個測試版功能。您可以在broker.config禁用它(Pulsar 2.4.1)

5 多主題訂閱
從Pulsar 1.23.0版開始,Pulsar用戶可以同時訂閱多個主題,兩種方式
1)基於正則表達式(regex),例如persistent://public/default/finance-*
2)通過明確定義的topic列表
當通過regex訂閱多個主題時,所有主題必須位於同一命名空間中

不能保證順序性
當消費者訂閱多個主題時,Pulsar通常就單個主題提供的所有訂購保證都不成立。如果您的Pulsar用例涉及任何嚴格的訂購要求,我們強烈建議您不要使用此功能
下面是一些Java的多主題訂閱示例:
import java.util.regex.Pattern;

import org.apache.pulsar.client.api.Consumer;
import org.apache.pulsar.client.api.PulsarClient;

PulsarClient pulsarClient = // Instantiate Pulsar client object

// Subscribe to all topics in a namespace
Pattern allTopicsInNamespace = Pattern.compile("persistent://public/default/.*");
Consumer<byte[]> allTopicsConsumer = pulsarClient.newConsumer()
.topicsPattern(allTopicsInNamespace)
.subscriptionName("subscription-1")
.subscribe();

// Subscribe to a subsets of topics in a namespace, based on regex
Pattern someTopicsInNamespace = Pattern.compile("persistent://public/default/foo.*");
Consumer<byte[]> someTopicsConsumer = pulsarClient.newConsumer()
.topicsPattern(someTopicsInNamespace)
.subscriptionName("subscription-1")
.subscribe();

6分區主題
分區topic和普通topic,對於訂閱模式如何工作,沒有任何不同。分區只是決定了從生產者生產消息到消費者處理及確認消息過程中發生的事情。
分區topic需要通過admin API指定創建。創建的時候可以指明分區的數量。
路由模式

模式 說明
RoundRobinPartition 如果沒有提供密鑰,則生產者將以循環方式發佈所有分區上的消息,以實現最大吞吐量。請注意,循環調度不是針對單個消息執行的,而是設置爲批處理延遲的相同邊界,以確保批處理有效。如果在消息上指定了密鑰,則分區的生產者將散列該密鑰並將消息分配給特定的分區。這是默認模式。
SinglePartition 如果沒有提供密鑰,生產者將隨機選擇一個單獨的分區並將所有消息發佈到該分區中。如果在消息上指定了密鑰,則分區的生產者將散列該密鑰並將消息分配給特定的分區。
CustomPartition 使用將被調用的自定義消息路由器實現來確定特定消息的分區。用戶可以通過使用Java客戶端並實現MessageRouter接口來創建自定義路由模式。

消息順序
消息的順序與消息路由模式和消息密鑰有關。通常,用戶需要按密鑰分區保證排序。
如果消息附加了密鑰,則在使用SinglePartition或RoundRobinPartition模式時,將根據哈希方案將消息路由到相應的分區

順序規則 說明 路由模式和key
按key分發(Per-key-partition) 所有具有相同key的消息都將按順序排列並放置在同一個分區中。 使用SinglePartition或RoundRobinPartition模式,每個消息都提供key
按生產者分發(Per-producer) 來自同一個生產者的所有消息都將按順序排列 使用SinglePartition模式,並且沒有爲每個消息提供key

7 非持久性主題
格式如下:
non-persistent://tenant/namespace/topic
生產者和消費者可以以與持久主題相同的方式連接到非持久主題,關鍵的區別在於主題名稱必須以非持久主題開頭。所有三種訂閱模式(獨佔、共享和故障轉移)都支持非持久性主題。
客戶端API
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://localhost:6650")
.build();
String npTopic = "non-persistent://public/default/my-topic";
String subscriptionName = "my-subscription-name";
消費
Consumer<byte[]> consumer = client.newConsumer()
.topic(npTopic)
.subscriptionName(subscriptionName)
.subscribe();
生產
Producer<byte[]> producer = client.newProducer()
.topic(npTopic)
.create();
8 消息保留和過期
默認情況下,Pulsar消息服務器:
立即刪除消費者已確認的所有消息,以及
將所有未確認的消息持久存儲在消息待辦事項中。
但是,Pulsar有兩個特性,使您能夠覆蓋此默認行爲:
消息保留使您能夠存儲已由消費者確認的消息
消息過期使您能夠爲尚未確認的消息設置生存時間(TTL)

9 消息去重
當消息被Pulsar持久化多於一次的時候,會發生數據重複。消息去重是Pulsar可選的特性,阻止不必要的消息重複,每條消息僅處理一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章